MySQl возвращает записи, соответствующие И / ИЛИ вторым значениям таблицы - PullRequest
2 голосов
/ 08 ноября 2011

Это такой основной вопрос, но по какой-то причине все мои знания SQL только что вышли из здания.Три основных стола:

Table A
id | name
---------
1 | John
2 | Mike
3 | Henry
4 | Cooper

Table B
id | tag
---------
1 | chocolate
2 | ice cream
3 | cookies

и стол, который объединяет два:

Table C
id | name_id | tag_id
---------------------
1 | 1 | 2
2 | 1 | 3
3 | 2 | 1
4 | 3 | 2
5 | 3 | 3

Я хочу найти людей, которым нравятся ОБА шоколад и печенье.Следующее дает мне всех людей, которые любят шоколад и печенье, но мне нужны только люди, которым нравятся оба (шоколад И печенье вместо шоколада ИЛИ печенье).

SELECT name FROM tablea a JOIN tablec c ON a.id = c.name_id WHERE c.tag_id = 1 AND c.tag_id = 3 GROUP BY name

но это по сути то, что я хочу.Кроме того, я хотел бы сделать это, не задействуя tableb в JOIN, потому что там, где я использую это, будут объединяться различные другие таблицы, и я не хочу путать картинку.Это должно быть так просто!

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Один хакерский метод:

SELECT name, COUNT(c.tag_id) AS cnt
FROM tablea a
JOIN tablec c ON a.id = c.name_id
WHERE c.tag_id IN (1,3)
GROUP BY name
HAVING cnt = 2

Подсчитайте, сколько предпочтений имеет каждый пользователь (который будет ограничен шоколадом или печеньем с помощью предложения where), а затем верните только тех пользователей, у которых есть 2 предпочтения.

2 голосов
/ 08 ноября 2011

Самый простой и быстрый способ - присоединиться к tablec дважды, один для конфет, а другой для печенья

select name 
  from tablea a
 inner join tablec chocolates on a.id = chocolates.name_id
 inner join tablec cookies    on a.id = cookies.name_id
 where chocolates.tag_id = 1
   and cookies.tag_id = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...