【问题标题】:MySQL Handling of GROUP BY. Getting ONLY_FULL_GROUP_BY errorMySQL 对 GROUP BY 的处理。出现 ONLY_FULL_GROUP_BY 错误
【发布时间】:2017-04-30 03:45:20
【问题描述】:

编辑:这已被确定为问题#1055 - Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this is incompatible with sql_mode=only_full_group_by的可能重复

这是不正确的,因为答案是更改全局 sql_mode 设置。 MySQL 基于 functional dependencies and returning arbitrary data 更改了 ONLY_FULL_GROUP_BY 默认值是有充分理由的

我的问题和答案对错误以及如何使用更详细的陈述规避它进行了简短而准确的解释。

感谢阅读,表格如下:

+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
|      1001 | PEN         | Pen Red   |     5000 |  1.23 |
|      1002 | PEN         | Pen Blue  |     8000 |  1.25 |
|      1003 | PEN         | Pen Black |     2000 |  1.25 |
|      1004 | PEC         | Pencil 2B |    10000 |  0.48 |
|      1005 | PEC         | Pencil 2H |     8000 |  0.49 |
+-----------+-------------+-----------+----------+-------+

所以如果我运行命令:

SELECT * FROM products GROUP BY productCode;

我收到以下错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'southwind.products.productID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

因此,根据我在阅读mysql documentation 时所收集到的信息,由于我的 GROUP BY 参数中有重复值,它会引发错误,拒绝任意返回某些内容。我宁愿不禁用此功能,因此非常感谢您了解我缺少什么以使查询工作的任何帮助。

谢谢。

【问题讨论】:

  • 那么您希望为每个组返回哪一行,因为您在每个 productCode 中没有相同的行?

标签: mysql mysql-error-1064


【解决方案1】:

根据您的模式,您只需这样做:

SELECT Max(price) FROM products GROUP BY productCode;

您会看到该错误,因为当您按 productCode 分组时,它表示前三个记录放在一起,最后两个记录放在一起,并且因为您使用了 select *,所以您希望显示所有字段。所以问题是你有三个不同的productID,而不仅仅是一个,如果你也想拥有它们,你需要像这样使用GROUP_CONCAT()。

SELECT GROUP_CONCAT(`productID ` separator ',') as ids , Max(price) FROM products GROUP BY productCode;

所以你将所有 ID 连接为一个字符串。

【讨论】:

    【解决方案2】:

    想出了如何克服错误。在上表中,productCode 中有重复值。当我向 GROUP BY 询问 MySQL 时,没有给它一个明确的行来抓取,所以它会引发错误。它希望我在 SELECT 参数中准确地告诉它要抓取哪些列值。

    现在在我的 SELECT 参数中使用聚合函数,如下所示:

    SELECT COUNT(productID),productCode, MAX(name), MAX(quantity), MAX(price) FROM products GROUP BY productCode;
    

    我得到一个结果集如下:

    +------------------+-------------+-----------+---------------+------------+
    | COUNT(productID) | productCode | MAX(name) | MAX(quantity) | MAX(price) |
    +------------------+-------------+-----------+---------------+------------+
    |                2 | PEC         | Pencil 2H |         10000 |       0.49 |
    |                3 | PEN         | Pen Red   |          8000 |       1.25 |
    +------------------+-------------+-----------+---------------+------------+
    

    需要明确的是,这些不是表中的实际行,因为它在 productID 中找到 COUNT 来告诉我每个唯一 productCode“组”有多少行。它还在寻找列的 MAX 值。

    如果我想根据 productCode 获取实际的唯一行,我可以使用以下两个语句:

    SELECT MIN(productID), productCode FROM products GROUP BY productCode;
    +----------------+-------------+
    | MIN(productID) | productCode |
    +----------------+-------------+
    |           1004 | PEC         |
    |           1001 | PEN         |
    +----------------+-------------+
    

    然后:

    SELECT * FROM products WHERE productID = 1004 OR productID = 1001;
    

    给我:

    +-----------+-------------+-----------+----------+-------+
    | productID | productCode | name      | quantity | price |
    +-----------+-------------+-----------+----------+-------+
    |      1001 | PEN         | Pen Red   |     5000 |  1.23 |
    |      1004 | PEC         | Pencil 2B |    10000 |  0.48 |
    +-----------+-------------+-----------+----------+-------+
    

    因此,您必须再次明确说明其他列。如果有人想在 cmets 中添加此内容,请执行此操作。谢谢。

    【讨论】:

    • 好吧,对你有好处!看,我试图帮助你,如果我没有尽我的职责让你满意,我很抱歉,我看到的是重复我的回答。但我不在乎
    • 顺便说一句,你为什么删除你关于我有聪明答案的评论!看来破坏力没那么大!!
    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多