我想写得简单一点:
SELECT p.id, p.title, p.price, p.status,
(SELECT COUNT(*)
FROM payments pa
WHERE pa.product = p.id AND
pa.vendor = p.member AND
pa.credited = 'Vendor' AND
pa.status IN ('Completed', 'Pending', 'Canceled_Reversal')
) AS sales,
(SELECT SUM(pa.price)
FROM payments pa
WHERE pa.product = p.id AND
pa.vendor = p.member AND
pa.credited = 'Vendor' AND
pa.status IN ('Completed', 'Pending', 'Canceled_Reversal')
) AS revenue
FROM products p
WHERE p.member = 1 AND
p.status NOT IN ('Deleted', 'Blocked');
这基本上是您的查询,具有更简单的别名和逻辑。
上有索引
payments(product, vendor, credit, status, price)
,这可能比其他方法更快。
另一种选择是:
SELECT p.id, p.title, p.price, p.status,
COUNT(pa.product) as sales
SUM(pa.price) as revenue
FROM products p LEFT JOIN
payments pa
ON pa.product = p.id AND
pa.vendor = p.member AND
pa.credited = 'Vendor' AND
pa.status IN ('Completed', 'Pending',
WHERE p.member = 1 AND
p.status NOT IN ('Deleted', 'Blocked')
'已取消'
但是,子查询可能更快。