我有一个基本的键值表,其中包含每个用户的一些数据。使用更新的mysql进行分组时,其sql_mode设置为only_full_group_by(新的默认值)。当我尝试运行此简单查询时:
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一旦修复了组错误,我将添加一个)。
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`) )
我可以运行哪个查询来解决此问题,或者需要添加什么索引?
这是MySQL用户的常见错误。在MySQL 5.7中,默认情况下,数据库会强制执行大多数其他SQL数据库多年来执行的标准语义。
规则是,选择列表中的每一列都必须是以下各项之一:
在您的查询中(我将扩展您的SELECT *):
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)也可以。
MAX(user_id)
MIN(user_id)