MYSQL- ONLY_FULL_GROUP_BY

117 阅读2分钟

5.7 默认开启

这与sql_mode=only_full_group_by不兼容

this is incompatible with sql_mode=only_full_group_by

假如一个 info 表 有多个国家,比如

namecountry
张三魏国
李四魏国
王五蜀国
霸道蜀国
橘子蜀国
蛋糕吴国

我们想要查询有多少国家,分别为…

select country from info group by country;

但是如果说我们这样

select name,country from info group by country;

因为执行group_by语句实际上把同一组内多行纪录合并成一行,同一个国家name并不相同,搜索引擎不知道该返回哪一条,所以认为这样的sql是武断的(arbitrary).

解决办法就是上面的解决办法,但是还要提醒朋友们,若非必要还是不要去掉,出现错误最大可能是sql语句本身存在问题.

2 可使用group_concat() 连接结果内容

GROUP_CONCAT函数将分组中的字符串,依据各种选项进行连接,将非空值从一组字符串连接到具有各种选项的字符串中。

GROUP_CONCAT( expression/DISTINCT expression //去重 字段 
       ORDER BY expression//排序 字段 
       SEPARATOR sep //分割符 
       );

注意:

  1. GROUP_CONCAT函数返回单个字符串,而不是值列表。 这意味着您不能在 IN操作符中使用。
  2. GROUP_CONCAT函数是一个聚合函数,要对值进行排序,必须在函数内使用 ORDER BY子句。
  3. 长度限制 默认设置的长度是1024 可以修改。
  4. group_concat默认返回的是BLOB大对象,可以使用concat,返回字符串,还可以在返回的内容,在加入其它的数据。

修改长度

//修改配置文件 
group_concat_max_len = 102400 #你要的最大长度 
//sql执行中设置 
SET GLOBAL group_concat_max_len=102400; SET SESSION group_concat_max_len=102400;

测试

要求:每年的每个用户的最新一条的记录?

数据如下 image.png 需要结果 image.png sql如下

SELECT `id`, user_id, user_name, price, `YEAR`, `time` 
FROM `order` WHERE `id` IN( 
        SELECT SUBSTRING_INDEX(group_concat(`id` order by time desc),',',1) as id 
        FROM `order` GROUP BY `year`,`user_id` 
    )