我有一个包含多个具有相同数据的行的表。我用SELECT DISTINCT
得到一个独特的行,它工作正常。但是,当我使用ORDER BY
与SELECT DISTINCT
它给我未排序的数据。SELECT DISTINCT在MySQL中如何工作?
谁能告诉我有多独特的作品?
根据什么标准选择行?
我有一个包含多个具有相同数据的行的表。我用SELECT DISTINCT
得到一个独特的行,它工作正常。但是,当我使用ORDER BY
与SELECT DISTINCT
它给我未排序的数据。SELECT DISTINCT在MySQL中如何工作?
谁能告诉我有多独特的作品?
根据什么标准选择行?
当您指定SELECT DISTINCT
时,它会为您提供所有行,消除结果集中的重复项。 “重复”是指所有字段具有相同值的行。例如,假设你有一个表,看起来像:
id | num
--------------
1 | 1
2 | 3
3 | 3
SELECT DISTINCT *
将返回所有行以上,而SELECT DISTINCT num
将返回两行:
num
-----
1
3
需要注意的是哪一行的实际行(例如:是否它是第2行或第3行)它是不相关的,因为结果是无法区分的。
最后,DISTINCT
应该不是影响如何ORDER BY
工作。
它看起来像在MYSQL中。阅读它:http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus
它几乎就像一个bug :) – Randy
@Icarus它执行的优化是无关紧要的,只要结果集以您期望的方式回归。 – NullUserException
从您的评论前,您要运行查询
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
这就是为什么你的结果是没有排序。
您所描述的行为发生在你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
子句中的表达式的值进行操作。如果第一行被处理,则(A
,B
)被放置在结果集中,并且它与行#1相关联。然后,当处理第2行时,SELECT
表达式的值会生成已存在于结果集中的记录(A
,B
)。由于DISTINCT
它被丢弃。第3行生成(X
,Y
),也放在结果集中。然后,ORDER BY column3
子句使记录在结果集中排序为(A
,B
),(X
,Y
)。
但是,如果行#2之前的行#1中处理然后,按照前面段落中暴露相同的逻辑,在结果集中的记录被分类为(X
,Y
),(A
,B
)。
当数据库引擎运行查询时,它没有对数据库引擎强加处理行的规则。数据库可以自由处理任何顺序的行,它认为它对性能更好。
您的查询是无效的SQL,并且它可以使用相同的输入数据返回不同的结果的事实证明了它。
您试图运行什么查询? – srivani
@srivani:从表中选择不同的id,其中id2 = 12312按时间顺序排序。 – insomiac
我知道这太迟了,但目前还没有接受的答案,所以我想知道OP是否仍然想要回答某些未在给定答案中涵盖的内容? –