我有一个应用程序,用户将他们购买的东西添加到他们的帐户。他们创建列表名称,例如我的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
这在一个查询中是否可行,或者您是否会重新设计数据的存储方式以使其更简单?我宁愿保持这样,所以如果例如sue决定让她的myEbatList在任何时候私有,产品将不会显示为她列出,并且标记可能决定公开他的列表。
建议赞赏
答案 0 :(得分: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
编辑:作为SELECT的一部分,我在CASE语句中包含了有关隐私的逻辑,因为它不会干扰JOIN标准,它只是显示信息。或者,您可以将该逻辑构建到派生表中的某种UNION结构中,然后加入到该结构中,但这可能效率较低。