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 に答える