2

ユーザーが購入したものを自分のアカウントに追加するアプリケーションがあります。彼らは、私の ebay 購入品などのリスト名を作成し、過去に購入したものを追加します。

彼らがリストを作成するとき、彼らはそれを公開するかどうかを選択できます。これが私が苦労しているところです。

製品のリストと、誰がどのリストにリストしたかを表示する必要がありますが、非公開リストにリストされている場合は、ユーザー名を非公開として、リスト名を非公開として表示します

4 つのテーブル:

製品

prod_id    store_name   product    user_id
-------    ---------    -------    -------
1          ebay         chair       1002
2          amazon       desk        1000
3          ebay         lamp        1001

ユーザー

user_id    name
-------    -------
1000       john
1001       mark
1002       sue

user_onto_list

user_onto_list_id    user_id      list_id
-------              ---------    -------
1                    1000         11
2                    1001         12
3                    1002         10

list_detail

list_id    visibility    list_name
-------    -------       ---------
10         open          myEbayList
11         open          myAmazonList
12         private       myPrivateList

結果は次のようになります。

product    listed_by    list_name
-------    ---------    ---------
chair      sue          myEbayList
desk       john         myAmazonList
lamp       PRIVATE      PRIVATE

これは 1 つのクエリで可能ですか、それともデータの保存方法を再設計してよりシンプルにしますか? たとえば、sue がいつでも myEbatList を非公開にすることに決めた場合、製品は彼女によってリストされているとは表示されず、マークは彼のリストを公開することを決定する可能性があります。

アドバイスをいただければ幸いです

4

1 に答える 1

1
select
p.product
, case when ld.visibility = 'private' then
   'PRIVATE'
  else
   u.name
  end as listed_by
, case when ld.visibility = 'private' then
   'PRIVATE'
  else
   ld.list_name
  end as listed_name
from products p

inner join users u on u.ser_id = p.user_id
inner join user_onto_list uol on uol.user_id = u.user_id
inner join list_detail ld on ld.list_id = uol.list_id

編集: プライバシーに関するロジックを CASE ステートメントに SELECT の一部として含めました。これは JOIN 基準に干渉しないため、情報を表示するだけです。または、そのロジックを派生テーブルのある種の UNION 構造に構築してから、それに結合することもできますが、おそらく非効率的です。

于 2012-09-29T08:51:51.630 に答える