数据库重新设计或复杂的4路连接查询

时间:2012-09-29 08:45:09

标签: mysql sql

我有一个应用程序,用户将他们购买的东西添加到他们的帐户。他们创建列表名称,例如我的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在任何时候私有,产品将不会显示为她列出,并且标记可能决定公开他的列表。

建议赞赏

1 个答案:

答案 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结构中,然后加入到该结构中,但这可能效率较低。