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

Mysql 数据库重新设计或复杂的4路连接查询,mysql,sql,Mysql,Sql,我有一个应用程序,用户将购买的东西添加到他们的帐户中。他们创建一个列表名,例如my ebay purchaes,然后添加他们过去购买的物品 当他们创建列表时,他们可以选择是否公开,而这正是我努力的方向 我需要显示产品列表以及谁将其列在哪个列表中,但是,如果它们列在私有列表中,则将用户名显示为private,将列表名称显示为private 4个表: 产品 prod_id store_name product user_id ------- --------- -----

我有一个应用程序,用户将购买的东西添加到他们的帐户中。他们创建一个列表名,例如my ebay purchaes,然后添加他们过去购买的物品

当他们创建列表时,他们可以选择是否公开,而这正是我努力的方向

我需要显示产品列表以及谁将其列在哪个列表中,但是,如果它们列在私有列表中,则将用户名显示为private,将列表名称显示为private

4个表:

产品

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

用户登录到用户列表

user_onto_list_id    user_id      list_id
-------              ---------    -------
1                    1000         11
2                    1001         12
3                    1002         10
详细清单

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保密,产品不会显示为她列出的产品,mark可能会决定公开他的列表

谢谢你的建议

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语句中隐私的逻辑,因为这不会干扰连接条件,它只是显示信息。或者,您可以将该逻辑构建到派生表中的某种联合结构中,然后连接到该表,但效率可能会更低。

如果可以的话,还有一个问题,用户可以添加产品,然后离开应用程序,但我将产品留在应用程序上,用于数据挖掘和搜索等。是否可以修改此查询,以仅显示某人在其列表中实际拥有的产品?因此,将产品(例如,monitor)添加到products表中,但它不会显示在结果集中,因为没有人在他们的列表中显示它-希望这是清楚的-再次感谢用户与产品和列表之间的内部连接将意味着尚未与用户和列表关联的产品将被排除在外,这是错误的:内部连接用户\u到uol.user\u id=u.user\u id上的uol列表上-应该是:内部连接用户\u到uol.prod\u id=p.prod\u id上的uol列表上-我的错误,因为没有包括有问题的uol.prod.id!啊!
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