我有一个基本的键值表,每个用户都有一些数据。使用更新的mysql,当您执行分组时,它将sql_mode
设置为only_full_group_by
(新的默认值)。当我尝试运行这个简单的查询时:
select * from user_features
where user_id = 1
group by feature_key
我收到以下错误:
SQL错误(1055):SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列'date.user_features.user_id',它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by
不兼容
使用此示例数据,我想基于feature_key
进行分组(一旦修复了组错误,我将添加group_concat
。)
| user_id | feature_key | feature_value |
+---------+-------------+---------------+
| 1 | color | red |
+---------+-------------+---------------+
| 1 | age | 15 |
+---------+-------------+---------------+
| 1 | color | blue |
+---------+-------------+---------------+
表格如下:
CREATE TABLE `user_features` (
`user_id` int(10) unsigned NOT NULL,
`feature_key` varchar(50) NOT NULL,
`feature_value` varchar(50) NOT NULL,
UNIQUE KEY `user_id_feature_key_feature_value` (`user_id`,`feature_key`,`feature_value`)
)
我可以运行哪些查询来修复此问题或需要添加哪些索引?
答案 0 :(得分:10)
这是MySQL用户的常见错误。在MySQL 5.7中,默认情况下,数据库强制执行大多数其他SQL数据库多年来一直执行的标准语义。
规则是选择列表中的每一列必须是以下之一:
在您的查询中(我将展开您的SELECT *
):
select user_id, feature_key, feature_value from user_features
where user_id = 1
group by feature_key
您按feature_key分组,但这意味着其他列不符合我上述规则。
以下是解决问题的方法:
select MAX(user_id), feature_key, GROUP_CONCAT(feature_value)
from user_features
where user_id = 1
group by feature_key
使用MAX(user_id)
似乎有点多余,因为根据WHERE子句条件,只有一个值可能。但也没有任何伤害。 MIN(user_id)
也可以。
另请参阅我过去在同一错误中的答案: