【问题标题】:Selecting data from two mysql tables where there may be nonexistent data in second table从两个mysql表中选择数据,其中第二个表中可能不存在数据
【发布时间】:2017-08-13 00:14:49
【问题描述】:

我有以下 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 个元素,其中 invoice_name 为空的 16 个。

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

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

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

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

【问题讨论】:

    标签: mysql sql if-statement


    【解决方案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 函数返回传递给它的第一个非空值,因此当公司不存在时,您将获得 Deleted company

    对内连接和左连接有很好的视觉描述here

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多