从两个mysql表中选择数据,其中第二个表中可能存在不存在的数据

时间:2013-10-01 18:01:07

标签: mysql sql if-statement

我有以下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为null。

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

此查询返回32个结果,两倍于发票表中的金额,两个用于每个不同的发票ID,一个公司名称为已删除公司,另一个公司名称为实际公司名称。

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

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

2 个答案:

答案 0 :(得分: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_companies中没有相应的行,则comp_companies.name将为空。 COALESCE函数返回传递给它的第一个非null值,因此当公司不存在时,您将获得Deleted company

内部和左​​侧连接here有一个很好的视觉描述。

答案 1 :(得分: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值的公司名称。