【问题标题】:Should ORDER BY change the result set?ORDER BY 是否应该更改结果集?
【发布时间】:2013-01-31 22:58:09
【问题描述】:

我的印象是,在 SQL 查询中使用 ORDER BY 不会影响为结果集选择了哪些记录。我认为 ORDER BY 只会影响结果集的呈现。

然而,最近,在我使用 ORDER BY 子句之前,我从查询中得到了意想不到的结果。这表明 a) ORDER BY 可以影响结果集中包含哪些记录,或者 b) 我还有其他一些需要处理的错误。

这是什么?

这里是查询:SELECT node_id FROM users ORDER BY node_id LIMIT 100

(node_id既是主键也是外键)。

如您所见,查询包含一个 LIMIT 子句。似乎如果我使用 ORDER BY,则在选择前 100 名之前对记录进行排序。原以为它会根据自然顺序选择100条记录,然后根据node_id排序。

我已经查找了有关 ORDER BY 的信息,但到目前为止,我能找到的唯一信息表明它仅影响演示文稿......我正在使用 MySQL。

【问题讨论】:

  • 您确定您所说的“自然顺序”与 MySQL 对该术语的解释相符吗?

标签: mysql sql-order-by


【解决方案1】:

ORDER BY 反映了 LIMIT 条款之前所有记录的顺序。为了得到你想要的结果,你需要这个:

select u.node_id
from users u
join
(
    SELECT node_id
    FROM users 
    LIMIT 100
) us ON u.node_id = us.node_id
ORDER BY u.node_id

这样,您将首先使用限制子句并获取前 100 条记录,然后对结果进行排序。 join 子句比双 Select 语句更快,尤其是在处理许多记录时。

【讨论】:

  • 嗨 Natahn,你的第一句话,ORDER BY 反映了 LIMIT 条款之前所有记录的顺序,告诉我我需要知道的一切。谢谢。
【解决方案2】:

您可以使用嵌套查询:

SELECT node_id  FROM 
(
SELECT node_id FROM users LIMIT 100
) u 
ORDER BY node_id 

【讨论】:

  • 这比加入慢
  • 这怎么比你的加入慢?您使用连接和嵌套查询,而我只使用嵌套查询。据我所知,您的解决方案只是添加到我的之上。
  • 是的,但是您加入的是子查询,这与该帖子所描述的不同。
  • 你有没有做过测试看看哪个更快?
  • 不,但我愿意。我目前无法访问足够大的数据库,所以我明天必须对其进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2013-10-09
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多