Фильтрация результатов из подзапроса в MySql - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть отношение многие ко многим пользователям и спорту, и я получаю объединенную строку всех спортивных имен, которые пользователь играет, используя подзапрос. Моя структура выглядит так:

user
===============
| id |  name  |
---------------
| 1  |  Hugo  |
| 2  |  Paco  |
| 3  |  Luis  |
---------------

sport
=================
| id |   name   |
-----------------
| 1  | tennis   |
| 2  | football |
| 3  | handball |
-----------------

user_sport
======================
| user_id | sport_id |
----------------------
|    1    |    3     |
|    1    |    1     |
|    2    |    1     |
----------------------

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

Я пытаюсь с этим запросом:

SELECT u.id, u.name,
COALESCE (
  (SELECT GROUP_CONCAT(s.name SEPARATOR ', ')
  FROM sport AS s
  LEFT JOIN user_sport AS us ON us.sport_id = s.id
  WHERE us.user_id = u.id),'') AS sports
FROM user u
WHERE us.sport_id IN (1,3)
GROUP BY u.id
ORDER BY g.name

но это не работает, потому что предложение where не знает таблицу user_sport. Итак, я должен создать новое JOIN вне подзапроса?

1 Ответ

2 голосов
/ 18 апреля 2019

Вы должны присоединиться с user_sport дважды. Один раз, чтобы отфильтровать его только по видам спорта в списке, а другой - по всем видам спорта, в которых играют выбранные пользователи.

SELECT u.id, u.name, GROUP_CONCAT(s.name SEPARATOR ', ') AS sports
FROM user AS u
JOIN user_sport AS us_filtered ON u.id = us_filtered.user_id
JOIN user_sport AS us_all ON u.id = us_all.user_id # all
JOIN sport AS s ON s.id = us_all.sport_id
WHERE us_filtered.sport_id IN (1, 3)
GROUP BY u.id
ORDER BY u.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...