ВЫБЕРИТЕ все общие элементы между двумя пользователями на трех таблицах - PullRequest
0 голосов
/ 03 марта 2011

У меня есть три таблицы

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 голосов
/ 03 марта 2011

Предварительный запрос общих элементов между A и B (через count (*) = 2) предварительно ограничит окончательный список элементов, из которых можно получить подробности.Затем соединение этого с таблицей элементов в качестве ВТОРОЙ таблицы в запросе должно повысить производительность.Особенно, если у 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
0 голосов
/ 03 марта 2011

Если у пользователя не может быть повторяющихся элементов, этот простой будет работать:

select item_id
from item_to_user
where user_id in ('A', 'B')
group by item_id
having count(*) > 1
0 голосов
/ 03 марта 2011
   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...