Выберите все элементы таблицы, которые не отображаются во внешнем ключе другой таблицы. - PullRequest
5 голосов
/ 20 июля 2009

Возьмем, к примеру, приложение, в котором есть пользователи, каждый из которых может входить ровно в одну группу. Если мы хотим выбрать список групп, в которых нет членов, каким будет правильный SQL? Я чувствую, что вот-вот пойму запрос, а потом он снова исчезает.

Бонусные баллы - с учетом альтернативного сенарио, где это соединение много-много, что такое SQL для определения неиспользуемых групп?

(если вы хотите конкретные имена полей :) Один-To-Many:

Table 'users': | user_id | group_id |
Table 'groups': | group_id |

Много-To-Many:

Table 'users': | user_id |
Table 'groups': | group_id |
Table 'user-group': | user_id | group_id |

Ответы [ 3 ]

4 голосов
/ 20 июля 2009

Группы, в которых нет участников (для пары «многие-многие»):

SELECT *
FROM   groups g 
WHERE NOT EXISTS 
    (
      SELECT 1 
      FROM users_groups ug 
      WHERE g.groupid = ug.groupid
    );

Этот Sql также будет работать в вашем "первом" примере, поскольку вы можете заменить "users" на "users_groups" в подзапросе =)

Что касается производительности, я знаю, что этот запрос может быть достаточно быстрым на Sql Server, но я не уверен, насколько ему нравится MySql ..

2 голосов
/ 20 июля 2009

Для первого попробуйте это:

SELECT * FROM groups
LEFT JOIN users ON (groups.group_id=users.group_id)
WHERE users.user_id IS NULL;

Для второго попробуйте это:

SELECT * FROM groups
LEFT JOIN user-group ON (groups.group_id=user-group.group_id)
WHERE user-group.user_id IS NULL;
1 голос
/ 27 сентября 2012
SELECT * 
FROM groups
WHERE groups.id NOT IN (
    SELECT user.group_id 
    FROM user
) 

Он вернет все идентификаторы группы, которых нет у пользователя

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