SELECT * FROM my_table GROUP BY section_identifier
是无效的SQL
query.
How GROUP BY
works?
让我们获取上面的查询,看看如何GROUP BY
作品。首先,数据库引擎选择所有匹配的行WHERE
条款。没有WHERE
此查询中的子句;这意味着表的所有行都用于生成结果集。
然后,它使用在中指定的表达式对行进行分组GROUP BY
clause:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
我在上面的列表中标记了各个组,以使一切都清楚。
下一步,数据库引擎从每个组中生成单行。但如何呢?
The SELECT
您的查询的子句是SELECT *
. *
代表表列的完整列表;在这种情况下,SELECT *
是一个简短的写法:
SELECT id, section_identifier, option_identifier, store_id
我们来分析一下列的值id
对于第一组。数据库引擎应该选择什么值id
? 17
or 23
? Why 17
以及为什么23
?
它没有任何支持的标准17
over 23
。它只是选择其中之一(可能17
但这取决于很多内部因素)并且是其中之一。
确定其值没有问题section_identifier
。这是用来GROUP BY
,它在一组中的所有值都相等。
选择困境再次出现在专栏上option_identifier
and store_id
.
根据标准SQL
您的查询无效并且无法执行。但是,某些数据库引擎按上述方式运行它。不存在的表达式的值(至少以下之一):
- 用在
GROUP BY
clause;
- 与一起使用GROUP BY聚合函数 in the
SELECT
clause;
- 功能上依赖于所使用的色谱柱
GROUP BY
clause;
是不确定的。
自版本以来5.7.5
, MySQL
实施功能依赖性检测并且默认情况下,它会拒绝无效的GROUP BY
像你一样查询。
如何让它发挥作用
我不清楚你想如何获得结果集。无论如何,如果你想从表中获取一些行GROUP BY
is not正确的做法。GROUP BY
does not从表中选择行,它会使用表中的值生成新值。生成的行GROUP BY
大多数时候,不匹配源表中的任何行。
您可以在以下位置找到问题的可能解决方案这个答案。在阅读并理解这个想法之后,您必须自己编写查询(并且您非常清楚应该如何选择“获胜”行)。