【问题标题】:Select one column, group by another - ONLY_FULL_GROUP_BY选择一列,按另一列分组 - ONLY_FULL_GROUP_BY
【发布时间】:2017-01-22 18:25:22
【问题描述】:

我有这个数据

1 => blue,
2 => red,
3 => red

我想要的是:

[1, 2]

禁用 MySql 严格模式,或者更具体地说,禁用 ONLY_FULL_GROUP_BY - 我可以这样做

SELECT id ... GROUP BY color

但启用它后我无法做到这一点

SELECT color, id ... GROUP BY color, id

产生与我开始时相同的结果

除禁用严格模式和/或 ONLY_FULL_GROUP_BY 之外的任何帮助 或者也许我应该禁用这些。它似乎弊大于利

【问题讨论】:

  • “它似乎弊大于利” - 相反,它会阻止你得到 [1, 3] 结果,你 不想,但同样可能会得到其他。 (因为红色的那两行之间有任何的区别,这只是你的想象。)

标签: mysql laravel select group-by strict


【解决方案1】:

问题是您按color 进行分组,但没有指定在存在多对一关系的情况下您想用id 做什么。

试试这个:

SELECT MIN(id) as id ... GROUP BY color

这行现在说“按颜色分组,并为每个选择最小的id。”,而之前它找到了两条“红色”记录,不知道如何组合它们。

【讨论】:

    【解决方案2】:

    如果你使用

    SET sql_mode = 'ONLY_FULL_GROUP_BY'; 
    

    那么你的意思是你想在 group by 中指明你用于聚合的所有列,所以如果你选择 col1,col2,col3 你必须在 group by 中设置 col1,col2,col3 .. 如果你不需要 'ONLY_FULL_GROUP_BY' 这不会发生,但在聚合中选择的行是不可预测的.. 请参阅本教程以获取示例 http://dev.mysql.com/doc/refman/5.6/en/counting-rows.html

    在您的情况下,您没有使用 count 或 min 或 max 之类的聚合函数,因此您似乎不需要 group by ..

    为了只获取第 1 行和第 2 行,您应该简单地使用像

    这样的过滤器
    select   color, id  from my_table where id<> 3;
    

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2019-02-18
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多