0

我正在运行以下 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”表中按此顺序排列。有什么方法可以按照内部查询给出的顺序得到我的整体结果?

谢谢

4

2 回答 2

2

试试这个变化:

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 列表中项目的顺序丢失,而是形成一个连接,然后您可以应用您想要的排序。

于 2009-11-09T01:58:06.150 回答
1

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

  1. 代替使用 IN 语句,您可以使用 JOIN 然后按辅助表的聚集索引进行排序。
  2. 修改版本 1。如果子查询每个专辑 ID 返回多于一行,则聚合 CTE 或子查询中的数据。您仍然需要对聚集索引进行排序。
于 2009-11-09T02:00:39.857 回答