【问题标题】:Keeping ordering in a WHERE IN clause in my SQL在 mySQL 的 WHERE IN 子句中保持排序
【发布时间】:2009-11-09 01:48:48
【问题描述】:

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

谢谢

【问题讨论】:

    标签: sql mysql where-in


    【解决方案1】:

    试试这个变体:

    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.* ...,因为理论上集合可以多次包含给定的专辑ID。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2012-12-23
      • 2020-10-13
      • 2012-12-17
      • 2010-12-07
      • 2018-07-19
      • 2012-07-19
      • 2012-06-16
      相关资源
      最近更新 更多