如何使用 only_full_group_by 修复查询组
How to fix query group with only_full_group_by
我有一个基本键值 table,其中包含每个用户的一些数据。使用更新后的 mysql,当您进行分组时,它会将 sql_mode
设置为 only_full_group_by
(新默认值)。当我尝试 运行 这个简单的查询时:
select * from user_features
where user_id = 1
group by feature_key
我收到以下错误:
SQL Error (1055): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'date.user_features.user_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with 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 |
+---------+-------------+---------------+
table 看起来像这样:
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 列表中的每一列都必须是以下之一:
- 在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)
也可以。
另请参阅我过去对同一错误的回答:
我有一个基本键值 table,其中包含每个用户的一些数据。使用更新后的 mysql,当您进行分组时,它会将 sql_mode
设置为 only_full_group_by
(新默认值)。当我尝试 运行 这个简单的查询时:
select * from user_features
where user_id = 1
group by feature_key
我收到以下错误:
SQL Error (1055): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'date.user_features.user_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with 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 |
+---------+-------------+---------------+
table 看起来像这样:
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 列表中的每一列都必须是以下之一:
- 在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)
也可以。
另请参阅我过去对同一错误的回答: