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

在我的SQL中的WHERE in子句中保持排序,sql,mysql,where-in,Sql,Mysql,Where In,我正在运行以下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 返回以下内

我正在运行以下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列表中项目的顺序已丢失,请改为形成联接,然后您可以应用所需的顺序。

尝试以下变体:

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列表中项目的顺序丢失,而不是形成联接,然后您可以应用所需的顺序。

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

  • 您可以使用联接,然后根据辅助表的聚集索引进行排序,而不是使用IN语句
  • 修正了1。如果子查询为每个Albun id返回多行,则聚合CTE或子查询中的数据。您仍然需要根据聚集索引进行排序

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

  • 您可以使用联接,然后根据辅助表的聚集索引进行排序,而不是使用IN语句
  • 修正了1。如果子查询为每个Albun id返回多行,则聚合CTE或子查询中的数据。您仍然需要根据聚集索引进行排序

  • 使用
    selectdistinct c.*…
    ,因为理论上集合可以多次包含给定的唱片集id。使用
    selectdistinct c.*…
    ,因为理论上集合可以多次包含给定的唱片集id。