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

Returning multiple values from subquery using CONCAT

我有一个PHP/MySQL申请

应用程序使用一个查询来获取 table leads 的值,并在一秒内使用 2 个子查询 return 值的 SUM 和 COUNT table refunds

2 table 与外键链接 lead_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

我想提高这个查询的性能。

我的想法是:

  1. 使用 CONCAT 将 2 个子查询合并为一个子查询 带竖线分隔符
  2. 在应用程序级别使用 PHP 分解 returned 字符串以 获取 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);

这种方法有效,但我的问题是:

  1. 这是错误的形式吗?
  2. 我有什么理由不应该这样做?
  3. 有更好的解决方案吗?

使用join!

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;

您可能会发现,在某些情况下,它比聚合前 join 更快。