Мне нужно выбрать все строки из пользовательской таблицы, где строка не имеет значения в таблице соединений - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть три таблицы:

Пользователи, группы и группыПользователи

Таблица пользователей:

id: 1 имя пользователя: admin

id: 2 username: barry

Таблица групп:

id: 102 имя: администратор

id: 103 имя: Пользователь сайта

GroupsUser (Объединить таблицу между пользователями и группами)

id: 1 user_id: 1 group_id: 102

id: 2 user_id: 2 group_id: 103

id: 3 user_id: 1 group_id: 103


Теперь у меня проблема: я хочу выбрать ВСЕХ пользователей из таблицы «Пользователи», которые НЕ принадлежат группе «Администратор». Я попытался это сделать:

SELECT COUNT(*) AS `count` 
FROM `Users` AS `User` 
LEFT JOIN `GroupsUsers` AS `GroupsUser` 

ON (`GroupsUser`.`user_id` = `User`.`id` AND `GroupsUser`.`group_id` NOT in ( 102 ) ) 

WHERE 
 (
  NOT ( `GroupsUser`.`group_id` IN ( 102 )
 ) 
)

По какой-то причине это по-прежнему возвращает учетную запись администратора. То, что я хочу сделать, это вернуть просто «Барри», или в этом случае - COUNT «1», а не «2».

Ответы [ 2 ]

3 голосов
/ 03 апреля 2011
SELECT COUNT(*) AS `count`
FROM Users AS User
LEFT JOIN GroupsUsers AS GroupsUser
    ON GroupsUser.user_id = User.id AND GroupsUser.group_id = 102
WHERE GroupsUser.user_id IS NULL

Левое объединение пытается найти пользователя в таблице GroupUsers, в группе 102 (администраторы). Если совпадение найдено, GroupsUser.user_id не равно нулю, поэтому обратное условие WHERE GroupsUser.user_id IS NULL сохраняется только в том случае, если совпадение не может быть найдено, то есть пользователь не является администратором.

Для комментария «Я хочу выбрать пользователей, которые ТОЛЬКО имеют эту строку в соответствующей таблице», который не совпадает ни с телом вопроса, ни с заголовком

SELECT COUNT(*) AS `count`
FROM Users AS User
LEFT JOIN GroupsUsers AS GroupsUser1
    ON GroupsUser1.user_id = User.id AND GroupsUser1.group_id = 102
LEFT JOIN GroupsUsers AS GroupsUser2
    ON GroupsUser2.user_id = User.id AND GroupsUser2.group_id <> 102
WHERE GroupsUser2.user_id IS NULL
0 голосов
/ 04 апреля 2011

вы пытаетесь получить пользователей, которые являются только «пользователями сайта», и в то же время они не являются «администраторами»

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

если это то, что вы пытаетесь сделать, попробуйте это:

SELECT `User`.*
FROM `Users` AS `User`
WHERE `User`.id NOT IN (
   SELECT `User2`.id
   FROM `Users` AS `User2`, `GroupsUsers` AS `GroupsUser`
   WHERE
        ( `GroupUser`.`user_id` = `User2`.`id` )
       AND
        ( `GroupUser`.`group_id` = 102 )
)

надеюсь, это поможет ...

удачи в вашем развитии ...

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