繁体   English   中英

在我的SQL中的WHERE IN子句中保持排序

[英]Keeping ordering in a WHERE IN clause in my SQL

我正在运行以下SQL查询:

SELECT * FROM cms_albums WHERE id IN (SELECT album_id FROM cms_albums_collections WHERE collection_id = 1 ORDER BY position ASC)

现在,假设内部查询

SELECT album_id FROM cms_albums_collections WHERE collection_id = 1 ORDER BY position ASC

返回以下内容:

album_id
"4"
"2"

这是我想要的顺序。 但是,整个查询将返回:

id   name   
"2" "Second album"
"4" "First album"

我假设这是因为在“ cms_albums”表中条目按此顺序排列。 有什么办法可以按照内部查询给出的顺序获得总体结果?

谢谢

试试这个变化:

SELECT  DISTINCT c.*
FROM    cms_albums c
JOIN    cms_albums_collections cc
ON      c.id = cc.album_id
WHERE   cc.collection_id = 1
ORDER BY
        cc.position ASC

IN列表中项目的顺序丢失,而是形成联接,然后可以应用所需的顺序。

我不同意这样的说法,即返回的结果必然是表的顺序或行插入表的顺序。 如果服务器使用的执行计划使用了非聚集索引或内存中的数据集,则排序顺序将不一定反映实际表的顺序或插入数据的顺序。 话虽如此,有一些选择可以实现您的目标:

  1. 代替使用IN语句,可以使用JOIN,然后按辅助表的聚集索引进行排序。
  2. 修改后的版本1。如果子查询每个白名单ID返回多个行,则将数据汇总到CTE或子查询中。 您仍然需要对聚集索引进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM