Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用CONCAT从子查询返回多个值_Php_Mysql_Sql_Concat - Fatal编程技术网

Php 使用CONCAT从子查询返回多个值

Php 使用CONCAT从子查询返回多个值,php,mysql,sql,concat,Php,Mysql,Sql,Concat,我有一个PHP/MySQL应用程序 应用程序使用一个查询来获取表leads,并使用两个子查询来返回第二个表Returns中的值的总和和计数 这两个表用外键链接lead\u id SELECT l.*, IFNULL( (SELECT SUM(amount) FROM refunds r WHERE l.lead_id = r.lead_id),0) amount_refunded,

我有一个PHP/MySQL应用程序

应用程序使用一个查询来获取表
leads
,并使用两个子查询来返回第二个表
Returns
中的值的总和和计数

这两个表用外键链接
lead\u id

SELECT l.*,
       IFNULL(
                (SELECT SUM(amount)
                 FROM refunds r
                 WHERE l.lead_id = r.lead_id),0) amount_refunded,
       IFNULL(
                (SELECT COUNT(*)
                 FROM refunds r
                 WHERE l.lead_id = r.lead_id),0) number_refunded
FROM leads l
我想提高这个查询的性能

我的想法是:

  • 使用CONCAT将两个子查询组合成一个子查询 使用管道分隔符
  • 在应用程序级别使用PHP将返回的字符串分解为 获取2个值
  • 示例如下:

    SELECT l.*,
      (SELECT CONCAT(IFNULL(COUNT(*),0),'|', IFNULL(SUM(amount),0))
       FROM fee_refunds r
       WHERE l.lead_id = r.lead_id) values_refunded
    FROM fee_leads l
    
    然后在应用程序中,在循环中:

    list($amount_refunded, $number_refunded) = explode('|', $row->values_refunded);
    
    这种方法可行,但我的问题是:

  • 这是坏形式吗
  • 有什么理由我不应该这样做吗
  • 有更好的解决办法吗
  • 使用
    加入

    SELECT l.*, r.amount_refunded, r.number_refunded
    FROM leads l LEFT JOIN
         (SELECT lead_id, COUNT(*) as number_refunded, SUM(amount) as amount_refunded
          FROM refunds r
          GROUP BY lead_id
         ) r
         ON l.lead_id = r.lead_id;
    
    在某些情况下,您可能会发现在聚合之前加入
    会更快。

    使用
    加入

    SELECT l.*, r.amount_refunded, r.number_refunded
    FROM leads l LEFT JOIN
         (SELECT lead_id, COUNT(*) as number_refunded, SUM(amount) as amount_refunded
          FROM refunds r
          GROUP BY lead_id
         ) r
         ON l.lead_id = r.lead_id;
    
    在某些情况下,您可能会发现在聚合之前加入
    会更快