3

ユーザーとライブラリの2つのテーブルがあります。ライブラリには、特定の方法で分類された本が含まれています。ユーザーは自分の本を特定の方法でソートすることもできます。2 つのテーブルの構造 (およびサンプル データ) は次のようになります。

図書館

bookid 位置
10 1
12 2
14 3
16 4

ユーザー

ユーザー ID ブック ID 位置
12669 12 1
12669 10 2

クエリで、ユーザー 12669 のすべての本を位置順に並べ替えて返すようにします。


select bookid from user where userid = 12669 group by position

これらの並べ替えられた本を返した後、ライブラリにある他の bookid (user には存在しない) を返す必要があります。bookid を繰り返さないでください。これらのシナリオの結果は次のようになります。

12
10
14
16

言い換えれば、ライブラリ内のすべての本はこのクエリによって返されるはずですが、ユーザーが選択した本は user.position に従って並べ替えられて

いるため、これには何らかの結合ステートメントが必要になると思います。私は試しました:
select bookid from user u right join library l on u.bookid = l.bookid where u.userid = 12669 group by u.position

ただし、これには構文エラーが発生します。この「問題」を解決する最善の方法は何ですか? どうもありがとう。

4

4 に答える 4

1

まず、投稿されたクエリのプロジェクションに、関連するテーブルのいずれにも属していない列名が含まれています。

次に、並べ替えがORDERBYによって実行されるGROUPBYを使用しています。

3番目のポイント:@Romilが指摘しているように、WHERE句でUSERテーブルを参照すると、外部結合がオーバーライドされ、内部結合が効果的に適用されます。したがって、USERテーブルのインラインビューから選択する必要があります。

最後に、必要な並べ替え順序を取得するには、最初にすべてのUSER.POSITIONをバンド化する必要があります。このバージョンのクエリでは、IFNULLを使用して、結合されたUSERレコードを持たない行に非常に高い値を割り当てます。したがって、返されたすべてのUSER.POSITION値で並べ替えてから、残りのすべての本のLIBRARY.POSITIONで並べ替えます。

select l.bookid 
from ( select * from user
        where userid = 12669 ) u
   right join library l 
     on (u.bookid = l.bookid) 
order by ifnull(u.position, 999999999) , l.position

注意:バベルのライブラリにインデックスを付けている場合、999999999を超える位置をサポートするのに十分な棚がある可能性がある場合は、その置換された値を増やすだけです。


「これは私にとってはうまくいきませんでした。私が望んでいた配置でbookidsを返しませんでした。」

率直に言って、それは驚くべきことだと思います。これは、指定した順序でサンプルデータを確実に返すSqlFiddleです。だから私は以前の質問を繰り返します:あなたの投稿されたテーブルの説明はあなたの実際のテーブルと正確に一致していますか?

于 2012-05-15T14:58:03.730 に答える
1

これでうまくいくはずです:)

SELECT l.bookid
FROM library l
LEFT OUTER JOIN user u on u.bookid = l.bookid
WHERE u.userid = 12669
ORDER BY isnull(u.position, 99999), l.position
于 2012-05-15T14:44:00.270 に答える
0

APC、Romil、aFに感謝します。私はついに、結合を使用しない解決策を見つけました。これは私のために働いた:

((
bookidを選択します
FROMユーザー
WHERE userid = 12669
注文順
)。
ユニオン(
bookidを選択します
FROMライブラリ
)。

最初のクエリはユーザーから順序付けられたbookidを選択し、次にunionステートメントはライブラリから他のすべての本を選択してこれを結果セットに追加します。この後のグループの配置は重要ではありませんでした。

于 2012-05-15T22:42:38.983 に答える
0
SELECT library.bookid bookid 
FROM   library 
       LEFT JOIN (SELECT * 
                  FROM   [user] 
                  WHERE  [USER].userid = 12669) users 
         ON [USERs].bookid = library.bookid 
ORDER  BY [USERs].userid DESC, 
          [USERs].position, 
          library.position 
于 2012-05-15T14:48:06.940 に答える