MYSQL выбор «многие ко многим» с условием «И» - PullRequest
1 голос
/ 16 марта 2020

Я нашел похожий вопрос в stackoverflow, но это не совсем та проблема, с которой я сталкиваюсь сейчас. Я не смог найти лучшего способа описания требуемого запроса, чем следующий:

Выберите все записи, которые имеют хотя бы свойство one И свойство two AND ...

Рассмотрим следующие таблицы:

пользователи

|  id  |  name  |
+------+--------+
|  1   |  john  |
+------+--------+
|  2   |  liu   |
+------+--------+  

спорт

|  id  |  user_id  |    sport   |
+------+-----------+------------+
|  1   |     1     |    swim    |
+------+-----------+------------+
|  2   |     1     |    run     |
+------+-----------+------------+
|  3   |     1     |  football  |
+------+-----------+------------+
|  4   |     1     |   volley   |
+------+-----------+------------+
|  5   |     2     |    swim    |
+------+-----------+------------+
|  6   |     2     |    run     |
+------+-----------+------------+

Я хотел бы иметь возможность задавать следующие запросы:

  1. Выбрать всех пользователей, которые только плавают (прямо)

Возвращает:

|  id  |  name  |
+------+--------+
|  1   |  john  |
+------+--------+
|  2   |  liu   |
+------+--------+
Выберите всех пользователей, которые могут плавать и бегать

Возвращает:

|  id  |  name  |
+------+--------+
|  1   |  john  |
+------+--------+
|  2   |  liu   |
+------+--------+
Выберите всех пользователей, которые могут плавать, бегать и играть в футбол

Возвращает:

|  id  |  name  |
+------+--------+
|  1   |  john  |
+------+--------+

Количество видов спорта должно быть динамическим c.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Количество элементов в списке на самом деле не может быть «Dynami c», по крайней мере, не больше, чем любой список значений.

SELECT u.id, u.name
FROM users AS u
INNER JOIN sports AS s ON s.user_id = u.id
WHERE s.sport IN ('football','run','swim')
GROUP B u.id, u.name
HAVING COUNT(DISTINCT sport) = 3
;

Для более длинных / более коротких списков, вам просто нужно настроить 3 соответственно.

1 голос
/ 16 марта 2020

Чтобы проверить все 3, вы можете сделать

select u.id, u.name
from users u
join sports s on s.user_id = u.id
group by u.id, u.name
having sum(sport = 'swim') > 0
   and sum(sport = 'run') > 0
   and sum(sport = 'football') > 0

Удалить те из запроса, которые вам не нужны, для других вариантов выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...