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

从两个mysql表中选择数据,其中第二个表中可能不存在数据,mysql,sql,if-statement,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 我的invoices表中有17个元素,其中16个元素inv

我有下面的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
我的invoices表中有17个元素,其中16个元素invoices\u name为null

我想要实现的是从invoice_name为NULL的invoices中选择所有内容,并直接从查询中获取由公司id附加的公司名称,或者如果comp_Companys表中没有此类公司id,则获取companyname处的文本“Deleted company”

此查询返回32个结果,是发票表中金额的两倍,每个不同发票id返回两个结果,一个以companyname作为已删除公司,另一个以companyname作为实际公司名称

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


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

假设没有公司名称以
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
值。

您需要从
发票中选择
,并加入
公司。通常这是一个内部联接,但由于
comp_companys
行可能不存在,您需要一个左联接:

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

对内部联接和左侧联接有很好的视觉描述

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