MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中且包含非聚合列

标签 mysql sql group-by mysql-error-1055

我想在不禁用 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;
---------^

指向的地方有问题。请注意,SELECTGROUP 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/

相关文章:

python - Pandas :Groupby 并在组内使用条件进行迭代?

MySQL - 自动更新 View

mysql - 两张表的SQL更新语句

php - 使用 IN 指令通过准备好的语句进行搜索

mysql - 如何获取一对多连接中 NULL 记录的数量

r 分组和计数

php - 在我公司的 MySQL 数据库中加密客户信息的最佳方法?

mysql - 无法弄清楚此表和关系的查询

mysql - 收集最近三天的个人记录

mysql - 使用嵌套查询提高 MySQL 中的 SELECT 性能