2011-09-16 47 views
5

我有一个包含多个具有相同数据的行的表。我用SELECT DISTINCT得到一个独特的行,它工作正常。但是,当我使用ORDER BYSELECT DISTINCT它给我未排序的数据。SELECT DISTINCT在MySQL中如何工作?

谁能告诉我有多独特的作品?

根据什么标准选择行?

+0

您试图运行什么查询? – srivani

+0

@srivani:从表中选择不同的id,其中id2 = 12312按时间顺序排序。 – insomiac

+0

我知道这太迟了,但目前还没有接受的答案,所以我想知道OP是否仍然想要回答某些未在给定答案中涵盖的内容? –

回答

1

当您指定SELECT DISTINCT时,它会为您提供所有行,消除结果集中的重复项。 “重复”是指所有字段具有相同值的行。例如,假设你有一个表,看起来像:

id | num 
-------------- 
1 | 1 
2 | 3 
3 | 3 

SELECT DISTINCT *将返回所有行以上,而SELECT DISTINCT num将返回两行:

num 
----- 
1 
3 

需要注意的是哪一行的实际行(例如:是否它是第2行或第3行)它是不相关的,因为结果是无法区分的。

最后,DISTINCT应该不是影响如何ORDER BY工作。

参考:MySQL SELECT statement

+2

它看起来像在MYSQL中。阅读它:http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus

+0

它几乎就像一个bug :) – Randy

+0

@Icarus它执行的优化是无关紧要的,只要结果集以您期望的方式回归。 – NullUserException

2

从您的评论前,您要运行查询

Select distinct id from table where id2 =12312 order by time desc. 

如我所料,这里是你的问题。您的选择列和按列排序是不同的。您的输出行按时间排序,但该顺序不一定需要保存在id列中。这是一个例子。

id | id2 | time 
------------------- 
1 | 12312 | 34 
2 | 12312 | 12 
3 | 12312 | 48 

如果运行

SELECT * FROM table WHERE id2=12312 ORDER BY time DESC 

,你会得到以下结果

id | id2 | time 
------------------- 
2 | 12312 | 12 
1 | 12312 | 34 
3 | 12312 | 48 

现在,如果你只选择这个id列,你会得到

id 
-- 
2 
1 
3 

这就是为什么你的结果是没有排序。

+0

如果你有多个id(例如:id = 2和id = 1多次发生),它将通过按时间去做desc选择哪一个? – insomiac

+0

如果您运行“从表中选择不同的ID,其中id2 = 12312 order by time desc”,重复项将被删除。如果您运行“从表中选择id,其中id2 = 12312 order by time desc”,结果将包含重复项。所以所有的id都会被返回。 – srivani

+0

感谢您的回复,例如,如果我想获得最近的ids按时间,如果我正在用不同的id时间desc。它不适用于MySQL。你知道如何区别于秩序吗? – insomiac

0

您所描述的行为发生在你ORDER BY是不存在的SELECT子句中的表达式。 SQL标准不允许这样的查询,但MySQL不太严格并且允许。

让我们尝试一个例子:

SELECT DISTINCT colum1, column2 
FROM table1 
WHERE ... 
ORDER BY column3 

假设表table1的内容是:

id | column1 | column2 | column3 
----+---------+---------+--------- 
    1 | A  | B  | 1 
    2 | A  | B  | 5 
    3 | X  | Y  | 3 

没有ORDER BY条款,以下两个记录(不ORDER BY的顺序执行上述查询返回不保证):

column1 | column2 
---------+--------- 
A  | B 
X  | Y 

但与ORDER BY column3订单也不能保证。

DISTINCT子句对存在于SELECT子句中的表达式的值进行操作。如果第一行被处理,则(AB)被放置在结果集中,并且它与行#1相关联。然后,当处理第2行时,SELECT表达式的值会生成已存在于结果集中的记录(AB)。由于DISTINCT它被丢弃。第3行生成(X,Y),也放在结果集中。然后,ORDER BY column3子句使记录在结果集中排序为(AB),(X,Y)。

但是,如果行#2之前的行#1中处理然后,按照前面段落中暴露相同的逻辑,在结果集中的记录被分类为(XY),(AB)。

当数据库引擎运行查询时,它没有对数据库引擎强加处理行的规则。数据库可以自由处理任何顺序的行,它认为它对性能更好。

您的查询是无效的SQL,并且它可以使用相同的输入数据返回不同的结果的事实证明了它。