子查询返回多于1行-多个选择MySQL

问题描述

我的查询

SELECT  (
    SELECT invoice_custom_fieldvalue FROM ip_invoice_custom WHERE invoice_id ='2474' AND invoice_custom_fieldid = '9'
) AS 'Claim Number',(
    SELECT invoice_custom_fieldvalue FROM ip_invoice_custom WHERE invoice_id ='2474' AND invoice_custom_fieldid = '7'
) AS 'Client Name',(
    SELECT invoice_custom_fieldvalue FROM ip_invoice_custom WHERE invoice_id ='2474' AND invoice_custom_fieldid = '8'
) AS 'Employer',(
    SELECT invoice_item_subtotal FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Invoice Amount',(
    SELECT invoice_item_tax_total FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Tax',(
    SELECT invoice_item_subtotal FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Tax1',(
    SELECT CONCAT('CAD') FROM ip_invoice_amounts WHERE invoice_amount_id ='2474'
) AS 'Currency',(
    SELECT invoice_date_created FROM ip_invoices WHERE invoice_id ='2474'
) AS 'Date',(
    SELECT client_name FROM ip_clients c INNER JOIN ip_invoices i ON c.client_id = i.client_id WHERE i.invoice_id ='2474'
) AS 'Requested by',(
    SELECT item_description FROM ip_invoice_items p WHERE p.invoice_id
) AS 'Transaction Subtype';

这是没有最后选择的结果:

Claim Number    Client Name Employer    Invoice Amount  Tax  Tax1   Currency    Date    Requested by
12345           John Smith  NULL        3326.99         0.00 0.00   CAD 2019-12-04  ATTN: Joe Smith

ip_invoice_items表如下:

item_id invoice_id item_description
1       2474       Some product
2       2474       Some other product
3       2474       Some other other product

所需的输出

Claim Number    Client Name Employer    Invoice Amount  Tax  Tax1   Currency    Date    Requested by Item Description
12345           John Smith  NULL        3326.99         0.00 0.00   CAD 2019-12-04  ATTN: Joe Smith  Some product
12345           John Smith  NULL        3326.99         0.00 0.00   CAD 2019-12-04  ATTN: Joe Smith  Some other product
12345           John Smith  NULL        3326.99         0.00 0.00   CAD 2019-12-04  ATTN: Joe Smith  Some other other product

每个invoice_id(最后选择语句)有多个项目描述。我该如何重写它,以便得到将为每个项目描述添加行的结果?

解决方法

涉及5个表,您可以以ip_invoice_custom开头,而LEFT可以加入另外4个表:

SELECT ic.`Claim Number`,ic.`Client Name`,ic.`Employer`,ia.invoice_item_subtotal `Invoice Amount`,ia.invoice_item_tax_total `Tax`,ia.invoice_item_subtotal `Tax1`,'CAD' `Currency`,i.invoice_date_created `Date`,c.client_name `Requested by`,ii.item_description `Transaction Subtype`
FROM (
  SELECT invoice_id,MAX(CASE WHEN invoice_custom_fieldid = '9' THEN invoice_custom_fieldvalue END) `Claim Number`,MAX(CASE WHEN invoice_custom_fieldid = '7' THEN invoice_custom_fieldvalue END) `Client Name`,MAX(CASE WHEN invoice_custom_fieldid = '8' THEN invoice_custom_fieldvalue END) `Employer`
  FROM ip_invoice_custom
  WHERE invoice_id ='2474' AND invoice_custom_fieldid IN ('7','8','9')
  GROUP BY invoice_id
) ic
LEFT JOIN ip_invoice_amounts ia ON ia.invoice_amount_id = ic.invoice_id 
LEFT JOIN ip_invoices i ON i.invoice_id = ic.invoice_id 
LEFT JOIN ip_clients c ON c.client_id = i.client_id
LEFT JOIN ip_invoice_items ii ON ii.invoice_id = ic.invoice_id
,

您可以通过加入发票ID上的表格,用一个选择语句完成所有这些操作。对于自定义表,您可以将该表连接3次以获得每个自定义值的值。

这是一个大概的草图:

events

我不确定您对货币行的处理方式,因此可能需要对其进行编辑,但这会在一个选择语句中完成整个搜索。

使用原始代码,您还可以将选择语句与ip_invoice_items表连接。您可以将较大的选择语句(不包括最后一个子选择)与ip_invoice_table结合使用,其中ip_invoice_id等于要查找的值。这是您可以做什么的粗略草图:

SELECT cn1.invoice_custom_fieldvalue as 'Claim Number',cn2.invoice_custom_fieldvalue as 'Client Name',em.invoice_custom_fieldvalue as 'Employer',ip_invoice_amounts.invoice_item_subtotal as 'Invoice Amount',ip_invoice_amounts.invoice_item_tax_total as 'Tax',CONCAT('CAD') as 'Currency',ip_clients.client_name as 'Requested by',ip_invoice_items.item_description as 'Transaction Subtype'
FROM ip_invoice_custom cn1
    JOIN ip_invoice_custom cn2 
       ON cn1.invoice_id=cn2.invoice_id
    JOIN ip_voice_custom em
       ON cn1.invoice_id=em.invoice_id 
    JOIN ip_invoice_amounts 
       ON cn1.invoice_id=invoice_amounts.invoice_amount_id
    JOIN ip_invoices
       ON cn1.invoice_id=ip_invoices.invoice_id
    JOIN ip_clients
       ON ip_invoices.client_id=ip_clients.client_id
    JOIN ip_invoice_items
       ON cn1.invoice_id=ip_invoice_items.invoice_id
WHERE cn1.invoice_custom_fieldid = '9' 
    AND cn2.invoice_custom_fieldid = '7'
    AND em.invoice_custom_fieldid = '8'
    AND cn1.invoice_id = '2474';

在括号中,您可以包括较大的select语句。我还建议为sub_select语句提供非字符串名称,并美化外部select语句中的输出。