使用 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
我想提高这个查询的性能。
我的想法是:
- 使用 CONCAT 将 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);
这种方法有效,但我的问题是:
- 这是错误的形式吗?
- 我有什么理由不应该这样做?
- 有更好的解决方案吗?
使用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
更快。
我有一个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
我想提高这个查询的性能。
我的想法是:
- 使用 CONCAT 将 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);
这种方法有效,但我的问题是:
- 这是错误的形式吗?
- 我有什么理由不应该这样做?
- 有更好的解决方案吗?
使用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
更快。