如何使用only_full_group_by修复查询组

问题描述 投票:3回答:1

我有一个基本的键值表,每个用户都有一些数据。使用更新的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`)
)

我可以运行什么查询来修复此问题或我需要添加哪些索引?

mysql sql mysql-error-1055
1个回答
10
投票

这是MySQL用户的常见错误。在MySQL 5.7中,默认情况下,数据库强制执行大多数其他SQL数据库多年来一直强制执行的标准语义。

规则是选择列表中的每一列必须是以下之一:

  • 以GROUP BY子句命名;也就是说你正在分组。
  • 在MIN,MAX(),SUM(),GROUP_CONCAT()等聚合函数中。
  • 功能上依赖于您要分组的列(这是MySQL对标准SQL行为的扩展,而其他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)也会工作。

另请参阅我过去在同一错误中的答案:

© www.soinside.com 2019 - 2024. All rights reserved.