LEFT JOIN со списком групп из одной таблицы и флажком из другой - PullRequest
2 голосов
/ 13 мая 2011

Во-первых, извините, если название немного не так. Я объясню свою ситуацию на примере.

У меня есть Groups таблица, подобная этой:

id  name
1   admin
2   developer
3   reviewer
4   beta tester
5   contributor

У меня есть таблица Permissions, например:

id   user_id  group_id
1    60       1
2    60       2
3    60       3

Я хочу использовать запрос JOIN, чтобы получить такой результат:

(perm.) name   part of group
admin          1
developer      1
reviewer       1
beta tester    0
contributor    0

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

Мой вопрос прост: как это можно сделать в MySQL? Очевидно, что это СОЕДИНЕНИЕ, но они, черт возьми, меня смущают. Спасибо за любую помощь.

Джеймс

Ответы [ 2 ]

3 голосов
/ 13 мая 2011
SELECT
    Groups.name,
    Permissions.id is not null
FROM Permissions
RIGHT JOIN Groups ON Permissions.group_id = Groups.id 
WHERE Permissions.user_id = 60

RIGHT JOIN означает, что у вас есть строка для каждой строки правой таблицы (то есть Groups).Если соответствующая строка в левой таблице (т. Е. Permissions) не существует, она создается с null для значений.

Надеюсь, я в порядке:)

ответ с LEFT JOIN, предложенным Джо, также совершенно корректен, но я думаю, что этот способ более расширяем, если вам нужно добавить больше условий.

3 голосов
/ 13 мая 2011
SELECT g.Name,
       CASE WHEN p.group_id IS NOT NULL THEN 1 ELSE 0 END AS part_of_group
    FROM Groups g
        LEFT JOIN Permissions p
            ON g.id = p.group_id
                AND p.user_id  = 60
    ORDER BY part_of_group DESC, g.Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...