Группа подсчета MYSQL с левым соединением, где есть запись в третьей таблице - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть таблица групп с подробной информацией о группах, к которым мои пользователи могут присоединиться, и отдельная таблица членов группы, чтобы показать, какие пользователи присоединились к каким группам.В таблице group_members есть только столбец для group_id и столбец для user_id.Если есть строка с group_id = 3 И user_id = 10, то мы знаем, что пользователь 10 является членом группы 3.

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

SELECT groups.*, COUNT(group_members.group_id) AS member_count
FROM groups LEFT JOIN
     group_members
     ON groups.group_id = group_members.group_id  
WHERE groups.deleted = 0 AND
      groups.trainer_id = ' .$trainer_id .' 
GROUP BY groups.group_id
ORDER BY groups.group_name'

Проблема заключается в том, что пользователи могут быть удалены и не всегда удаляются из таблицы group_members, когда это происходит.Это означает, что пользователи могут отображаться в подсчете, даже если они больше не находятся в системе в таблице третьих пользователей.

Так что я хочу включить в подсчет только членов группы, если они также присутствуют втаблица пользователей.Я думал, что смогу сделать это с INNER JOIN между членами группы и таблицами пользователей.Примерно так ...

SELECT groups.*, COUNT(users.user_id) AS client_count
FROM groups LEFT JOIN
     group_members
     ON groups.group_id = group_members.group_id INNER JOIN
     users
     ON group_members.user_id = users.user_id  
WHERE groups.deleted = 0 AND groups.trainer_id = ' .$trainer_id .'
GROUP BY groups.group_id
ORDER BY groups.group_name

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

Если бы кто-нибудь мог объяснить мне, как я могу добиться того, чего я хочу, я был бы очень благодарен.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

A LEFT JOIN для пользователей` должно действительно решить вашу проблему:

SELECT g.*, COUNT(u.user_id) AS client_count
FROM groups g LEFT JOIN
     group_members gm
     ON g.group_id = gm.group_id LEFT JOIN
     users u
     ON gm.user_id = u.user_id  
WHERE g.deleted = 0 AND g.trainer_id = ' .$trainer_id .'
GROUP BY g.group_id
ORDER BY g.group_name;

Если группа не возвращается, то она не соответствует условиям фильтрации WHERE.Все группы, удовлетворяющие этим условиям, должны быть возвращены, если для обоих объединений используется LEFT JOIN.

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

0 голосов
/ 16 декабря 2018

Вы можете просто сделать левое соединение вместо INNER в таблице пользователей.Функция COUNT пропускает пустые записи, поэтому ваш последний запрос должен работать.

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