1

ユーザーのお気に入りシステムを作成しようとしていますが、必要なことを達成するクエリを作成するのに苦労しています。例として果物を使用します。

まず、ここに私の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ありません。userfavoritescurrentfruits

ユーザーが通常、お気に入りを保存せずにサイトにアクセスすると、次のように、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 は個別のエントリのみを処理するため、下の選択で表示される可能性のある重複行を処理することを望んでいましたが、悲しいかな。

私がやりたいことを達成するクエリを作成する方法を誰か教えてもらえますか? ありがとう。

4

1 に答える 1

3

UNION を使用する必要はありません。試す:

select c.id, c.price, c.`months left in season`, i.color, i.rating 
from currentfruit c
left join fruitsinfo i on c.id = i.id
left join userfavorites f on c.id = f.id and f.userid = 5
order by case when f.id is not null then 0 else 1 end, c.price desc
于 2013-04-28T11:03:10.470 に答える