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