我现在有四张桌子:
item_to_list(用于存储列表和项目之间的关系)
| item_to_list_id | list_id | item_id |
-----------------------------------------
item_tb
| item_id | item_name |
-----------------------
list_tb(是属于唯一用户的项目列表,列表不能由两个用户拥有)
| list_id | list_name | user_id |
---------------------------------
user_tb
| user_id | user_name |..etc..
-------------------------------
项目可以属于一个或多个列表。
列表只能属于一个用户,用户可以拥有一个或多个列表......
不同的列表可以有相同的项目(想想你每周购买相同商品的购物清单)
基本上可以想象我的网站是一个电子商务,列表是一个订单,我想知道两个用户(我知道名称和ID)有多少项共同购买了他们在我的网站上的整个体验....
因此,给定user_id = A和user_id = B我如何进行mysql查询以选择属于用户A和用户B的所有项目?
注意:我写了一个类似的问题,但是关于三个表而不是四个。我非常了解这些渐进式问题,谢谢!!!
更新:我的错误写了一个错误的表名,现在是正确的
答案 0 :(得分:0)
伪代码中的错误答案希望您理解,基本上想法是创建一组用户A项目,并通过item_id与用户B项集合加入。
显然,要生成用户A和用户B项,您需要使用不同的where子句进行相同的查询。
Select A.item_id from
(select user A items) as A
join (select user B items ) as B
on A.item_id=B.item_id
我希望您可以创建select user X items
查询
答案 1 :(得分:0)
第一个问题是获取用户购买的所有商品。使用item_to_list
:
SELECT item_id FROM item_to_list WHERE user_id = A;
但是,在user_id
和item_to_list
中保留list_tb
会导致大量数据重复。 (谷歌关系数据库规范化对此有趣的东西)。因此,我会从user_id
中移除item_to_list
字段,并依赖list_tb
来存储此信息。
然后查询变为:
SELECT DISTINCT item_id
FROM item_to_list AS itl, list_tb AS ltb
WHERE ltb.user_id = A
AND ltb.list_id = itl.list_id;
这假设您的item_to_list.item_to_user_id
与item_tb.list_tb
此时,您可以生成一个表格,其中包含用户购买的所有商品的列表。现在问题是为用户A生成一个表,为用户B生成一个表,然后比较结果。
SELECT itl.item_id
FROM item_to_list AS aitl, list_tb AS altb
WHERE altb.user_id = A
AND altb.list_id = aitl.list_id;
AND aitl.item_id IN
SELECT DISTINCT item_id
FROM item_to_list AS bitl, list_tb AS bltb
WHERE bltb.user_id = B
AND bltb.list_id = bitl.list_id;
注意:这是经常未经测试的:)并且在效率方面可能会有所改进。
编辑:已完成答案