【问题标题】:MySql 5.7 ORDER BY clause is not in GROUP BY clause and contains nonaggregated columnMySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列
【发布时间】:2017-06-22 17:24:42
【问题描述】:

我试图在不禁用 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 错误就消失了,但我最终得到了 5 条记录而不是 4 条记录,这不是我想要的。由于我是根据“项目”字段对项目进行分组,所以应该只有四个记录

【问题讨论】:

  • 为什么要算t.qty?使用products 上的外连接,您应该计算products 中的一列,例如COUNT(p.id),以便在没有匹配的情况下计数为零。
  • 我想products 表中的 ID 真的是 4-3-2-1 而不是 1-1-1-1? (所以“第一”是第 4 项,它在 payments 中具有最新的 created 日期,因此在通过 t.created DESC 订购时排在第一位,如您在所需结果中所示。)

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


【解决方案1】:

这是您的查询:

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 中,您(几乎)总是希望通过 first 表中的某些内容进行聚合,而不是第二个。

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)。

【讨论】:

  • 这是否意味着如果我从第一个表中选择多个列,则所有这些列都需要聚合?
  • @Alko 。 . .这是最佳实践,是的。
  • 谢谢,这很有帮助。我接受了你的回答。
【解决方案2】:

第 1 项有两个 t.created。因此请决定要按哪个排序。例如:

ORDER BY MIN(t.created) DESC;

【讨论】:

    【解决方案3】:

    对我来说,您应该按 p.title 分组查询

      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;
    

    或

      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 p.created;
    

    然后对于“但是如果我将查询更改为 GROUP BY t.item,t.created 错误就消失了”请记住,从 mysql 5.7 开始,如果您使用未在 group by 中的选定列,则会出现错误..

    如果你真的需要,你可以禁用使用适当的 sql 模式设置,例如

    SET sql_mode = ''   
    

    https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

    最后按顺序排列的列对 group by 和 ONLY_FULL_GROUP_BY 参数没有影响 .. 但如果我按顺序排列的列不在 select 中实际上没有意义

    【讨论】:

    • 即使我按标题分组,仍然给我 5 条记录,而不是 4 条
    • 我已删除 .. order by .. 再次尝试检查 .. 并添加了对 p.created order by .answer updated 的厌恶。
    猜你喜欢
    • 2018-06-12
    • 2016-12-12
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多