SELECT DISTINCT如何在MySQL中运行?

时间:2011-09-16 17:28:45

标签: mysql sql

我有一个包含多行的表,这些行具有相同的数据。我使用SELECT DISTINCT获取一个唯一的行,它工作正常。但是当我将ORDER BYSELECT DISTINCT一起使用时,它会向我提供未分类的数据。

有人能告诉我有多么独特吗?

根据选择行的标准?

3 个答案:

答案 0 :(得分: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

这就是您的结果未排序的原因。

答案 1 :(得分: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 :(得分: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子句中存在的表达式的值进行操作。如果首先处理行#1,则将{AB)放在结果集中,并将其与行#1相关联。然后,当处理行#2时,SELECT表达式的值产生已经在结果集中的记录(AB)。因为DISTINCT它被删除了。第3行产生(XY),它也放在结果集中。然后,ORDER BY column3子句使记录在结果集中排序为(AB),(XY)。

但是如果在#1行之前处理第2行,那么遵循前一段中公开的相同逻辑,结果集中的记录被排序为(XY),( AB)。

数据库引擎没有规定它在运行查询时处理行的顺序。数据库可以按照它认为对性能更好的任何顺序自由处理行。

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