2012-09-29 53 views
2

我有一個應用程序,用戶將他們購買的東西添加到他們的帳戶。他們創建列表名稱,例如我的eBay收購,然後添加他們以前買過的東西。數據庫重新設計或複雜的4種方式加入查詢

當他們創建列表,他們可以選擇是否其公共與否,而這正是我掙扎。

我需要顯示的產品列表,誰列出他們在這名單,但如果他們上市到私有列表則顯示用戶名作爲私人和列表名稱爲私有

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 

在一個查詢這是可能的,還是會重新設計數據的存儲方式,使其更簡單?我寧願保持這樣,所以如果例如起訴決定讓她的myEbatList在任何時候都是私密的,那麼產品不會顯示爲被她列出,並且商標可能決定公開他的名單。

諮詢讚賞

回答

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的一部分邏輯,因爲這不符合聯接條件干擾,它只是顯示信息。或者,您可以將該邏輯構建到派生表中的某種UNION結構中,然後加入到該結構中,但這可能效率較低。

+0

真棒,非常感謝! –

+0

@達倫:很高興幫助! – davek

+0

一個問題,如果我可以,用戶可以添加一個產品,然後離開應用程序,但我留下的產品在那裏進行數據挖掘和搜索等。這個查詢可以修改爲只顯示某人實際上在他們的名單上的產品?所以將產品e,g,顯示器添加到產品表中,但它不會顯示在結果集中,因爲沒有人在列表中顯示它 - 希望這一點很清楚 - 再次感謝 –