我有一个包含多行的表,这些行具有相同的数据。我使用SELECT DISTINCT
获取一个唯一的行,它工作正常。但是当我将ORDER BY
与SELECT DISTINCT
一起使用时,它会向我提供未分类的数据。
有人能告诉我有多么独特吗?
根据选择行的标准?
答案 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
的工作方式。
答案 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,则将{A
,B
)放在结果集中,并将其与行#1相关联。然后,当处理行#2时,SELECT
表达式的值产生已经在结果集中的记录(A
,B
)。因为DISTINCT
它被删除了。第3行产生(X
,Y
),它也放在结果集中。然后,ORDER BY column3
子句使记录在结果集中排序为(A
,B
),(X
,Y
)。
但是如果在#1行之前处理第2行,那么遵循前一段中公开的相同逻辑,结果集中的记录被排序为(X
,Y
),( A
,B
)。
数据库引擎没有规定它在运行查询时处理行的顺序。数据库可以按照它认为对性能更好的任何顺序自由处理行。
您的查询是无效的SQL,并且它可以使用相同的输入数据返回不同的结果,这证明了它。