选择四个表上两个用户之间的所有共同项

时间:2011-03-03 16:16:44

标签: mysql

我现在有四张桌子:

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的所有项目?

注意:我写了一个类似的问题,但是关于三个表而不是四个。我非常了解这些渐进式问题,谢谢!!!

更新:我的错误写了一个错误的表名,现在是正确的

2 个答案:

答案 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_iditem_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_iditem_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;

注意:这是经常未经测试的:)并且在效率方面可能会有所改进。

编辑:已完成答案