使用IN时Mysql子查询排序

5

在MySQL子查询中结果的顺序是否影响实际查询的顺序?我尝试了一下,但是由于有时候看起来是这样,有时候又不是,所以没有得出真正的结果。

例如:

SELECT name FROM people WHERE pid IN (SELECT mid FROM member ORDER BY mdate)

“order by”子句在这种情况下会影响结果的顺序吗?
谢谢。

“它不能”是指绝对没有办法完成这个任务吗? - Rico Ocepek
怎么办?在子查询中使用order by子句影响结果顺序吗?我的答案是否定的。 - Hamlet Hakobyan
4个回答

3
不行,如果您想按照自己的需求更改顺序,最好使用 JOIN。示例如下:
select name 
from people p inner join member m on p.pid = m.mid
order by p.name

2
“wont work here” 意味着这只是我的查询的一小部分,而且它在其他地方也会引起问题,但你已经在这里回答了我的问题:D - Rico Ocepek
抱歉,我没有听清楚你的问题。我的回答是否解决了你的疑问? - Rahul Tripathi
它回答了我的问题。 - Rico Ocepek

3
您的外部查询没有ORDER BY;因此,排序结果不保证。
我猜在这种情况下可能会受影响的只有优化器,它可能会根据子查询结果的排序方式生成不同的执行计划...

1
它确实不能。数据来自from子句。您的子查询在where子句中。它只是用于过滤行。如果您想要排序:
select p.name
from people p join
     (select member, min(mdate) as minmdate
      from member
      group by member
     ) m
     on p.pid = m.mid
order by minmdate;

也就是说,将两个表格的结果连接起来。我假设member可能有重复,你想要每个成员关联的最早日期。


1

无论外部查询结果是否依赖于子查询中的order by子句,都不应该依赖于顺序。如果您需要外部查询结果的特定顺序,则应在外部查询中显式使用order by子句。据我所知,在子查询中仅在必须在SELECT子句的TOP子句中使用时才使用order by子句是有意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接