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

时间:2011-03-03 15:44:11

标签: mysql sql

我有三张桌子

item_to_user(用于存储用户和项目之间的关系)

| item_to_user_id | user_id |  item_id |
-----------------------------------------

item_tb

| item_id | item_name |
-----------------------

user_tb

| user_id | user_name |
-----------------------

一个项目可以属于一个或多个用户,反之亦然,这就是我使用第一个表格的原因。

因此,给定user_id = A和user_id = B我如何进行mysql查询以选择属于用户A和用户B的所有项目?

注意:昨天我写了一个类似的问题,但是关于两张桌子而不是三张。

3 个答案:

答案 0 :(得分:0)

   SELECT i.*
     FROM item_tb AS i
LEFT JOIN item_to_user AS iu
       ON iu.item_id = i.item_id
LEFT JOIN user_tb AS u
       ON iu.user_id = u.user_id
    WHERE u.user_name IN ('A', 'B')
 GROUP BY i.item_id
   HAVING COUNT(i.item_id) > 1

答案 1 :(得分:0)

通过预先显示A和B之间的公共项目(通过count(*)= 2)将预先限制可能的最终项目列表以获取详细信息。然后将其作为查询中的SECOND表连接到items表应该有助于提高性能。特别是如果A& B有50个常用项目,但你的项目表包含1000个项目。

select straight_join 
       i.item_id, 
       i.item_name
   from
       ( select iu.item_id
               from item_to_user iu
                  join user_tb u
                     on iu.user_id = u.user_id
                    and u.user_name in ( 'A', 'B' )
               group by 1
               having count(*) = 2 ) Matches,
       item_tb i
   where
      Matches.item_id = i.item_id

答案 2 :(得分:0)

如果用户不能重复项目,那么这个简单的项目将起作用:

select item_id
from item_to_user
where user_id in ('A', 'B')
group by item_id
having count(*) > 1