【发布时间】:2016-09-14 13:18:10
【问题描述】:
我刚刚升级到 MySQL 5.7,不幸的是,GROUP BY 的一些功能已经消失。我想从我的movies 表中选择所有电影,只要int 类型的movies.id 不是重复的。我之前在 MySQL 5.6 中的查询是:
SELECT *
FROM movies
WHERE movies.title LIKE '%example%'
GROUP BY movies.id
如果我有两部电影具有相同的 id,它只会显示一部电影,而不是该电影及其副本。
当我升级到 MySQL 5.7 时,GROUP BY 给了我错误,我被告知使用 ORDER BY。但是这个查询:
SELECT *
FROM movies
WHERE movies.title LIKE '%example%'
ORDER BY movies.id
返回重复的电影。那么,有没有办法将其过滤掉,并且仅在不重复时才返回一行?
编辑:例如,如果这是我的movies 表:
movies
==================
| id | title |
==================
| 1 | example |
------------------
| 2 | example |
------------------
| 1 | example |
------------------
这是每个查询的输出:
Previous query result (with MySQL 5.6)
=======
1 | example
2 | example
New query result (with MySQL 5.7 and ORDER BY)
=======
1 | example
1 | example
2 | example
我希望最终结果不包含重复项(因此结果应该类似于第一个查询结果)。
编辑 2:我知道我有点滥用 MySQL 处理 GROUP BY 的方式。不幸的是,我对 MySQL 没有太多经验,并从 StackOverflow 得到了答案。我只想返回表中不包含重复 ids 的所有列。
【问题讨论】:
-
为什么会有重复的电影?如果您没有 PRIMARY KEY,那么就 RDBMS 而言,您没有表。
-
@Strawberry 这是学校的作业。我们故意为这项任务提供了错误的数据。 :|不幸的是,我们要返回不重复的行。在 5.7 之前一切正常。但我无法降级,因为我需要它提供的一些新功能。
-
GROUP BY 旨在与聚合函数一起使用。 SELECT DISTINCT 旨在用于不需要聚合的地方。
-
@Strawberry 据我了解,我在不知不觉中滥用了 MySQL 5.6 的工作方式(我从堆栈溢出的答案中得到了
GROUP BY的东西)。我真的很想返回所有不包含重复 ID 的行。 -
一般 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或作为集合函数的参数。 (旧的 MySQL 版本不关心这个,而是返回任意结果。)