ユーザーのお気に入りシステムを作成しようとしていますが、必要なことを達成するクエリを作成するのに苦労しています。例として果物を使用します。
まず、ここに私のfruitsinfo
テーブルがあります:
id | color | rating
apples red 8.4
oranges orange 9.1
blueberries blue 8.8
pineapple yellow 7.9
peaches orange 8.3
次にcurrentfruit
、旬の果物のみをリストし、現在の市場価格を示す表があります (このデータは非常に悪いですが、ご了承ください)。
id | price | months left in season
apples 1.25 6
avocados 1.42 4
pears 1.24 3
oranges 1.75 5
blueberries 2.20 4
最後に、userfavorites
ユーザー ID とフルーツ ID を含むテーブル:
userid | fruitid
5 apples
5 peaches
5 pears
userid = '5' のユーザーで作業するだけです。ここで注意すべき点がいくつかあります。 のすべてのエントリが にあるわけではなく、 のすべてのエントリがにあるわけcurrentfruits
ではfruitsinfo
ありません。userfavorites
currentfruits
ユーザーが通常、お気に入りを保存せずにサイトにアクセスすると、次のように、currentfruits
左に結合fruitsinfo
され、価格順に並べられているだけが表示されます。
id | price | months left in season | color | rating
blueberries 2.20 4 blue 8.8
oranges 1.75 5 orange 9.1
avocados 1.42 4 null null
apples 1.25 6 red 8.4
pears 1.24 3 null null
今、私が欲しいのは、ユーザーのお気に入りの果物がcurrentfruits
テーブルにあるかどうかを確認し、最初にそれらの結果をリストし (価格順)、次に残りの現在の果物 (価格順) をリストすることです。ユーザーはリンゴ、ナシ、モモをお気に入りとして持っていますが、現在の果物にはリンゴとナシしかないので、テーブルは次のようになります。
id | price | months left in season | color | rating
apples 1.25 6 red 8.4
pears 1.24 3 null null
blueberries 2.20 4 blue 8.8
oranges 1.75 5 orange 9.1
avocados 1.42 4 null null
私の最初の考えは、次のようなことをすることでした:
SELECT *
FROM userfavorites
JOIN currentfruits ON userfavorites.fruitid = currentfruits.id
JOIN fruitsinfo ON currentfruits.id = fruitsinfo.id
ORDER BY currentfruits.price DESC
UNION
SELECT *
FROM currentfruits
LEFT JOIN fruitsinfo ON currentfruits.id = fruitsinfo.id
ORDER BY currentfruits.price DESC
1SELECT
つ目は目的のテーブルの最初の 2 行を取得し、2 つ目はSELECT
ユーザーがお気に入りなしで表示するテーブル全体を取得します。残念ながら、これは私が望んでいたように行をまとめただけではありませんでした。また、UNION は個別のエントリのみを処理するため、下の選択で表示される可能性のある重複行を処理することを望んでいましたが、悲しいかな。
私がやりたいことを達成するクエリを作成する方法を誰か教えてもらえますか? ありがとう。