在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
会导致重复项从顶部移到底部,因此只剩下最后一行。这会导致排序中的一些问题。
是这种情况,还是我错误地分析了事情?
答案 0 :(得分:5)
要理解两件事:
一般来说,除非您指定ORDER BY
子句,否则结果集为unordered;如果您指定non-strict order(即ORDER BY
超过非唯一列),则在该结果集中出现的该顺序下相等的记录的顺序是未定义的。
我怀疑您可能正在指定这样一个非严格的顺序,这是您的问题的根源:通过在一组足以唯一标识每条记录的列上指定ORDER BY
来确保您的排序是严格的你关心它在结果集中的最终位置。
DISTINCT
may use GROUP BY
,导致结果按分组列排序;也就是说,SELECT DISTINCT a, b, c FROM t
将生成一个看似ORDER BY a, b, c
已应用的结果集。同样,指定足够严格的订单以满足您的需求将覆盖此效果。
在您的更新之后,请注意上面的第2点,很明显,将结果分组到实现DISTINCT
的效果使得无法按照未分组的列p.id
进行排序;相反,你想要:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC
答案 1 :(得分:1)
DISTINCT
通知MySQL如何为您构建行集,ORDER BY
提供了如何呈现此行集的提示。所以答案是:DISTINCT
首先,ORDER BY
最后。
答案 2 :(得分:1)
在大多数情况下,应用DISTINCT
和ORDER BY
的顺序不会影响最终输出。
但是,如果您还使用GROUP BY
,则将影响最终输出。在这种情况下,ORDER BY
在 GROUP BY
后执行,这将返回意外结果(假设您希望在分组之前执行排序)。