MySQL Запрос для участника группы COUNT и IF isParticipant Statement - PullRequest
0 голосов
/ 22 марта 2020

У меня проблема с MySQL запросом, и я не могу ее решить.

Исходная ситуация следующая: у меня есть таблица с пользователями и таблица с группами. Обе таблицы связаны между собой многогранной (group_participant) таблицей.

Работает следующий запрос:

SELECT 
    id, 
    COUNT(participant.groupId) AS participantsCount
FROM 
    group 
LEFT JOIN 
    group_participant participant 
ON 
    participant.groupId = id
GROUP BY
    id

Теперь я хочу расширить этот запрос фильтром, который возвращает только записи, в которых я являюсь участником, но подсчет участников не должен затронут.

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

Это должно быть что-то вроде:

SELECT 
    id, 
    COUNT(participant.groupId) AS participantsCount, 
    IF(participant.userId = "87b67168-0d7d-46c5-9437-29f996b3d85d", 1, 0) AS isParticipant
FROM 
    group 
LEFT JOIN 
    group_participant participant
ON 
    participant.groupId = id
WHERE 
    participant.userId = "87b67168-0d7d-46c5-9437-29f996b3d85d" 
GROUP BY
    id

Как я могу решить это?

1 Ответ

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

Если вам нужны только те группы, в которых вы участвуете, удалите предложение WHERE и задайте условие в предложении HAVING:

SELECT 
    g.id, 
    COUNT(gp.userId) AS participantsCount
FROM group g LEFT JOIN group_participant participant gp
ON gp.groupId = g.id
GROUP BY g.id
HAVING MAX(CASE WHEN gp.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d' THEN 1 ELSE 0 END) = 1 

В такой базе данных, как MySql, вы можете написать HAVING предложение вроде этого:

HAVING MAX(gp.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d') = 1  

Чтобы установить флаг:

SELECT 
    g.id, 
    COUNT(gp.userId) AS participantsCount,
    MAX(CASE WHEN participant.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d' THEN 1 ELSE 0 END) AS isParticipant
FROM group g LEFT JOIN group_participant participant gp
ON gp.groupId = g.id
GROUP BY g.id

или для MySql:

MAX(participant.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d') AS isParticipant
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...