【问题标题】:How to fix query group with only_full_group_by如何使用 only_full_group_by 修复查询组
【发布时间】:2018-05-30 17:09:23
【问题描述】:

我有一个基本的键值表,其中包含每个用户的一些数据。使用更新后的 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 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“date.user_features.user_id”;这与 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
  • 我不知道,我只知道在旧版本的 mysql 中这将是一个有效的查询并返回一行(我相信红色会被填充)。
  • 您对红色的看法,必须有一些理由或标准来选择具有红色的行,或者将您的唯一索引限制为 user_id 和功能键,这样每个用户就不能有2 个相同的功能键

标签: mysql sql mysql-error-1055


【解决方案1】:

这是 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) 也可以。

另请参阅我过去对同一错误的回答:

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 2019-08-03
    • 2019-09-05
    • 2020-08-22
    • 2018-06-18
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多