我有三张桌子
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的所有项目?
注意:昨天我写了一个类似的问题,但是关于两张桌子而不是三张。
答案 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