2

我有以下 SQL 语句

SELECT invoices.id, invoices.companyid IF( comp_companies.id = invoices.companyid, comp_companies.name, 'Deleted company' ) AS companyname
FROM invoices, comp_companies
WHERE invoice_name IS NULL
LIMIT 0 , 30

我的发票表中有 17 个元素,其中 invoice_name 为空的 16 个。

我想要实现的是从 invoice_name 为 NULL 的发票中选择所有内容,并直接从查询中获取由公司 ID 附加的公司名称,或者如果 comp_companies 表中没有这样的公司 ID,则获取在公司名称处输入“已删除公司”。

此查询返回 32 个结果,是 invoices 表中金额的两倍,每个不同的发票 ID 有两个结果,一个带有 companyname 作为 Deleted Company,一个带有 companyname 作为实际公司名称。

我已经尝试按 invoices.id 分组,或者只选择不同的 invoices.id,但没有任何效果。

有人可以告诉我查询的“问题”是什么,我怎样才能达到预期的结果?

4

2 回答 2

1

您需要选择invoices加入comp_companies。通常这是一个内连接,但由于该comp_companies行可能不存在,您需要一个左连接

SELECT
  invoices.id,
  invoices.companyid,
  COALESCE(comp_companies.name, 'Deleted company') as companyname
FROM invoices
LEFT JOIN comp_companies ON invoices.companyid = comp_companies.id
WHERE invoice_name IS NULL
LIMIT 0, 30

如果 中没有对应的行,则为comp_companiescomp_companies.name。该COALESCE函数返回传递给它的第一个非空值,因此当公司不存在时,您将获得Deleted company.

这里有一个很好的内连接和左连接的视觉描述

于 2013-10-01T18:07:29.190 回答
0

假设没有公司名称null作为其名称,这应该可以解决问题:

SELECT i.id, COALESCE(c.name, "Deleted Company") CompanyName FROM invoices i
LEFT JOIN comp_companies c ON i.companyid = c.id
WHERE i.invoice_name IS NULL
LIMIT 0, 30

如果有,那么这将返回“已删除公司”作为具有该null值的公司名称。

于 2013-10-01T18:06:26.547 回答