members.first_name,
members.last_name,
members.user_name
FROM
members
JOIN members_in_chat
ON members_in_chat.id_member = members.id
JOIN chats
ON chats.id = members_in_chat.id_chat
Left JOIN members_in_group
ON members.id = members_in_group.id_member
WHERE
members_in_group.id_group = ? IS NOT TRUE
GROUP BY members.id;
необходимо исключать пользователей которые есть в этой группе
- но искючаются только записи, в которых указывается эта группа - а не все в которых есть такой пользователь
Таблица members_in_group подцеплена по LEFT JOIN, поэтому фильтрация по группе не уберёт всю строку, а занулит только часть строки members_in_group.*
А, не. Прикол в другом. Даже если заменить на INNER JOIN, у вас будет написано "если пользователь состоит в какой-нибудь группе кроме $1". Чтобы проверить отсутствие группы используйте паттерн "anti join": from members left join members_in_group ON members.id = members_in_group.id_member and members_in_group.id_group = ? where members_in_group.id_member is null или, как посоветовал Константин, используйте where not exists
Обсуждают сегодня