Запрос во многих отношениях многих - MySQL - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующие таблицы, таблица A и таблица B

Таблица A (пользователи)

userid    name
--------------------
1         Sam
2         David

Таблица B (hobbylist)

hobbyid   hobby
--------------------
1         singing
2         drawing

У меня есть таблица мостов (связь между многими)

Таблица C (user_hobby)

userid    hobbyid
--------------------
1         1
2         2
1         2

Я хочу запросить условие, в котором я хочу узнать, у какого пользователя есть хобби, равное "рисованию" (hobbyid 2), но не "пению" (hobbyid 1). Как я могу достичь этого без подзапроса ?

Я пытался с помощью следующего запроса

SELECT * 
FROM hobbylist 
     JOIN user_hobby AS uh 
       ON hobbylist.hobbyid = uh.hobbyid
     JOIN users AS us 
       ON us.userid = uh.userid
WHERE hobby = "drawing" 
  AND hobby <> "singing"

Я все еще получаю обоих пользователей в результате запроса выше,Он должен был показывать только user = David.

Как этого добиться без использования подзапроса ?

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Вы можете использовать group by и having:

select uh.userid
from user_hobby uh join
     hobby h
     on h.hobbyid = uh.hobbyid
where h.hobby in ('drawing', 'singing')
group by uh.userid
having min(h.hobby) = max(h.hobby) and min(h.hobby) = 'drawing';

Обратите внимание, что для получения userid вам не нужна таблица пользователей.

0 голосов
/ 18 октября 2018

Попробуйте присоединиться как:

select * from hobbylist, user_hobby, users where users.userid = user_hobby.userid and hobbylist.hobbyid = user_hobby.hobbyid and hobbylist.hobby = "drawing" and hobbylist.hobby <> "singing"
0 голосов
/ 18 октября 2018
  • Вы можете Group by на ИД пользователя и имени.Это объединит результаты в одну строку для конкретного пользователя.
  • Теперь мы можем использовать Having с Sum() для фильтрации случаев.Sum(hobby = 'drawing') будет положительным для пользователей, имеющих рисование в качестве хобби.Sum(hobby = 'singing') будет нулевым для пользователей, которые вообще не поют в качестве хобби.

Попробуйте следующее:

SELECT us.userid,
       us.name
FROM   hobbylist
       JOIN user_hobby AS uh
         ON hobbylist.hobbyid = uh.hobbyid
       JOIN users AS us
         ON us.userid = uh.userid
GROUP  BY us.userid,
          us.name
HAVING Sum(hobby = 'drawing')
       AND Sum(hobby = 'singing') = 0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...