【问题标题】:Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause [closed]如果没有 GROUP BY 子句,则将 GROUP 列(MIN(),MAX(),COUNT(),...)与没有 GROUP 列的混合是非法的[关闭]
【发布时间】:2017-01-11 14:24:03
【问题描述】:

我确信这曾经有效。

SELECT first_name, surname, id, time, MIN(timeinmilliseconds) FROM users WHERE team= '$key'

我不知道在哪里或为什么要使用 GroupBy 子句。

【问题讨论】:

  • 定义“用于工作”。在我看来,运行和产生一个不确定的结果(正如在 MySQL 中记录的那样)并不构成正确的代码(除非这是代码的明确意图)。

标签: mysql sql group-by


【解决方案1】:

SQL92 和更早的版本不允许选择列表的查询, HAVING 条件或 ORDER BY 列表指的是非聚合列 既不在 GROUP BY 子句中命名,也不在功能上 取决于(唯一确定的)GROUP BY 列。例如, 此查询在标准 SQL92 中是非法的,因为非聚合名称 选择列表中的列未出现在 GROUP BY 中:

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;

对于查询 在 SQL92 中是合法的,必须从 select 中省略 name 列 在 GROUP BY 子句中列出或命名。

SQL99 及更高版本根据可选功能 T301 允许此类非聚合 如果它们在功能上依赖于 GROUP BY 列:如果这样的 name 和 custid 存在关系,查询合法。这 例如,如果是 custid 的主键 客户。

MySQL 5.7.5 及更高版本实现了功能依赖检测。如果 ONLY_FULL_GROUP_BY SQL 模式已启用(默认情况下), MySQL 拒绝选择列表、HAVING 条件或 ORDER BY 列表指的是未在其中命名的非聚合列 GROUP BY 子句在功能上也不依赖于它们。 (前 5.7.5,MySQL不检测函数依赖,默认不启用ONLY_FULL_GROUP_BY。对于描述 5.7.5 之前的行为,请参阅 MySQL 5.6 参考手册。)

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

当没有group by 时,就没有函数依赖的列。您可能想要一个子查询来获取min(timeinmilliseconds) 的值。

【讨论】:

    【解决方案2】:

    函数 MIN(),MAX(),COUNT(),SUM(),AVG() 是 sql 中用于对结果集进行分组的聚合函数。 根据语法,您需要在 group by 子句中提及要应用聚合函数的列。

    在您的查询中,您使用 MIN() 函数来找出所选列的最短时间(以毫秒为单位)。所以它应该遵循如下语法。

            SELECT first_name, surname, id, time, MIN(timeinmilliseconds) 
            FROM users 
            WHERE team= '$key'
            GROUP BY first_name,surname,id,time
    

    希望这能消除您的疑虑。

    【讨论】:

      【解决方案3】:

      没用过

      SELECT first_name, surname, id, time, MIN(timeinmilliseconds) 
      FROM users 
      WHERE team = '$key'
      GROUP BY id, first_name, surname, time
      

      我不知道它会产生你想要的,但它应该运行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 2014-09-09
        • 2019-02-11
        • 2016-01-10
        • 2021-02-25
        • 1970-01-01
        • 2021-02-03
        相关资源
        最近更新 更多