5.7 默认开启
这与sql_mode=only_full_group_by不兼容
this is incompatible with sql_mode=only_full_group_by
假如一个 info 表 有多个国家,比如
| name | country |
|---|---|
| 张三 | 魏国 |
| 李四 | 魏国 |
| 王五 | 蜀国 |
| 霸道 | 蜀国 |
| 橘子 | 蜀国 |
| 蛋糕 | 吴国 |
我们想要查询有多少国家,分别为…
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 //分割符
);
注意:
- GROUP_CONCAT函数返回单个字符串,而不是值列表。 这意味着您不能在 IN操作符中使用。
- GROUP_CONCAT函数是一个聚合函数,要对值进行排序,必须在函数内使用 ORDER BY子句。
- 长度限制 默认设置的长度是1024 可以修改。
- group_concat默认返回的是BLOB大对象,可以使用concat,返回字符串,还可以在返回的内容,在加入其它的数据。
修改长度
//修改配置文件
group_concat_max_len = 102400 #你要的最大长度
//sql执行中设置
SET GLOBAL group_concat_max_len=102400; SET SESSION group_concat_max_len=102400;
测试
要求:每年的每个用户的最新一条的记录?
数据如下
需要结果
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`
)