【发布时间】:2012-06-05 21:10:11
【问题描述】:
在 MySQL 查询中,当使用 DISTINCT 选项时,ORDER BY 是否在删除重复项后应用?如果没有,有没有办法让它这样做?我认为这会导致我的代码出现一些问题。
编辑:
这是有关导致我的问题的原因的更多信息。我明白,乍一看,这个顺序并不重要,因为我正在处理重复的行。但是,情况并非完全如此,因为我使用INNER JOIN 对行进行排序。
假设我有一个论坛线程表,其中包含以下数据:
+----+--------+-------------+
| id | userid | title |
+----+--------+-------------+
| 1 | 1 | Information |
| 2 | 1 | FAQ |
| 3 | 2 | Support |
+----+--------+-------------+
我在另一个表中也有一组帖子,如下所示:
+----+----------+--------+---------+
| id | threadid | userid | content |
+----+----------+--------+---------+
| 1 | 1 | 1 | Lorem |
| 2 | 1 | 2 | Ipsum |
| 3 | 2 | 2 | Test |
| 4 | 3 | 1 | Foo |
| 5 | 2 | 3 | Bar |
| 6 | 3 | 5 | Bob |
| 7 | 1 | 2 | Joe |
+----+----------+--------+---------+
我正在使用以下 MySQL 查询来获取所有线程,然后根据最新帖子对它们进行排序(假设具有更高 id 的帖子更新:
SELECT t.*
FROM Threads t
INNER JOIN Posts p ON t.id = p.threadid
ORDER BY p.id DESC
这可行,并生成如下内容:
+----+--------+-------------+
| id | userid | title |
+----+--------+-------------+
| 1 | 1 | Information |
| 3 | 2 | Support |
| 2 | 1 | FAQ |
| 3 | 2 | Support |
| 2 | 1 | FAQ |
| 1 | 1 | Information |
| 1 | 1 | Information |
+----+--------+-------------+
但是,如您所见,信息是正确的,但存在重复的行。我想删除这样的重复,所以我改用SELECT DISTINCT。然而,这产生了以下结果:
+----+--------+-------------+
| id | userid | title |
+----+--------+-------------+
| 3 | 2 | Support |
| 2 | 1 | FAQ |
| 1 | 1 | Information |
+----+--------+-------------+
这显然是错误的,因为“信息”线程应该在顶部。似乎使用DISTINCT 会导致从上到下删除重复项,因此只剩下最后一行。这会导致排序出现一些问题。
是这样吗,还是我分析错了?
【问题讨论】:
-
您认为它会导致什么问题?会有什么不同?
-
为什么重要?在应用distinct之前或之后,顺序应该相同
-
您能否向我们展示您正在尝试的内容以及您遇到的实际问题的示例查询?
-
@bfrohs - 对我来说没有任何意义。如果先对行进行排序,然后删除重复项,而不是先删除重复项,然后对剩余的内容进行排序,则会得到相同的结果。
-
@bfrohs,但使用 DISTINCT 你会得到 (1:a;1:c;2:b)。
标签: php mysql sql-order-by