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

子查询返回多个行-多个选择MySQL,mysql,select,Mysql,Select,我的问题是 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 invo

我的问题是

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_发票_项目表如下所示:

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

每个发票id(最后一个select语句)都有多个项目描述。我如何重写它,以便得到一个将为每个项目描述添加行的结果?

通过连接发票id上的表,您可以使用一条select语句来完成这一切。对于自定义表,您可以连接该表3次,以获得每个自定义值的值

下面是一个大概的草图,它看起来像什么:

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语句中完成整个搜索

使用原始代码,还可以将select语句与ip_invoice_items表连接起来。您可以将较大的select语句(不包括最后一个子select)与ip_invoice_表联接,其中ip_invoice_id等于您要查找的值。以下是您可以做的大致示意图:

SELECT Claim_Number, Client_Name_Employer, Invoice_Amount, Tax,
   Tax1_Currency, Date, item_description
FROM ip_invoice_items JOIN 
   ( ... ) as ip_info  
WHERE ip_invoice_items.item_id = '2474';

括号中可以包含较大的select语句。我还建议为子select语句指定非字符串名称,并美化外部select语句中的输出。

涉及5个表,您可以从
ip\u invoice\u 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

能否显示示例架构(所有表的
show create table table name
输出)、示例数据、您得到的结果以及您想要得到的结果?谢谢@ysth我已经用架构信息更新了问题。您期望的输出是什么?@forpas-更新,谢谢!谢谢@vasco马德里。我遇到的问题是数据库的关系结构很差。在前三个select语句中,我试图基于同一个表中的两个条件获取值。在ip_发票自定义中,该表有多个发票ID为“2474”的行,并根据该表中的自定义_字段_ID显示索赔编号、客户名称或雇主。我如何在没有多个选择的情况下构造查询,以完成使用多个条件获取数据的任务?@mcook16您能否在问题中添加您希望输出的内容?已更新。谢谢@mcook16也许我误解了这个问题,但您是否在问如何将原始问题中的select语句组合成一个select语句?如果您将原始代码包含在括号中,我建议的答案将为您提供所需的输出。我的问题是前三个选择依赖于同一表中的两个WHERE子句(发票\自定义\字段ID='9','7',等等)。我不确定如何使用您提供的代码获取此数据。