我有两个 sql,它们给了我相同的结果:
查询一:
SELECT
u.*, COUNT(po.order_id) products_count
FROM (SELECT * FROM orders o WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)) o
LEFT JOIN products_orders po ON po.order_id=o.id
JOIN users u ON u.id=o.user_id
GROUP BY po.order_id
和查询 2:
SELECT
u.*, o.id order_id, COUNT(po.order_id) products_count
FROM users u
JOIN orders o ON o.user_id=u.id
LEFT JOIN products_orders po ON po.order_id=o.id
WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)
GROUP BY po.order_id
你的聚合没有多大意义(大多数数据库,甚至最新版本的 MySQL 都会拒绝它 - 请参阅
ONLY_FULL_GROUP_BY
)......你可能想要GROUP BY o.user_id
,(也许,也可能orders_id
,但然后将它也添加到SELECT
子句中)并且你如果这样做可以更快一些:此查询的执行计划不同,它使用派生表(MySQL 或 MariaDB 并不总是很擅长),但它只会寻找您的用户一次。
您可以在此处查看dbfiddle的所有详细信息