我想在不禁用 my.ini 中的“only_full_group_by”的情况下找出答案
这是我的查询:
SELECT
p.title,
COUNT(t.qty) AS total
FROM
payments t
LEFT JOIN products AS p
ON p.id = t.item
WHERE t.user = 1
GROUP BY t.item
ORDER BY t.created DESC;
和表格:
付款:
id item user created
============================
1 1 1 2017-01-10
2 2 1 2017-01-11
3 3 1 2017-01-12
4 4 1 2017-01-13
5 1 1 2017-01-14
产品:
id title created
==========================
1 First 2016-12-10
1 Second 2016-12-11
1 Third 2016-12-12
1 Fourth 2016-12-13
最后的结果应该看起来是谎言:
Name Total
First 2
Second 1
Third 1
Fourth 1
但是如果我将查询更改为 GROUP BY t.item, t.created
错误消失了,但我最终得到了五个记录而不是四个,这不是我想要的。由于我根据“项目”字段对项目进行分组,因此应该只有四个记录
最佳答案
这是您的查询:
SELECT p.title, COUNT(t.qty) AS total
-------^
FROM payments t LEFT JOIN
products AS p
ON p.id = t.item
WHERE t.user = 1
GROUP BY t.item
---------^
ORDER BY t.created DESC;
---------^
指向的地方有问题。请注意,SELECT
和 GROUP BY
指的是不同的列。在 LEFT JOIN
中,您(几乎)总是希望根据第一个 表中的内容进行聚合,而不是第二个。
ORDER BY
是另一个问题。您没有按此列进行聚合,因此您需要确定所需的值。我猜测 MIN()
或 MAX()
:
SELECT p.title, COUNT(t.qty) AS total
FROM payments t LEFT JOIN
products AS p
ON p.id = t.item
WHERE t.user = 1
GROUP BY p.title
ORDER BY MAX(t.created) DESC;
我还要补充一点,COUNT(t.qty)
是可疑的。通常 qty
指的是“数量”,你想要的是总和:SUM(t.qty)
。
关于MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中且包含非聚合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056446/