Довольно сложно резюмировать мой вопрос в заголовке, так что он не полностью охвачен ... извините за это :)

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

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

Так что я:

Таблица 1: userID, userName и т. Д.

Таблица 2: (с уникальным составным индексом) groupID, userID

Моя лучшая попытка такова:

SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.userID = t2.userID
WHERE userName = 'John' AND groupID = 1

(чтобы узнать, является ли Джон членом группы 1)

Думаю, проблема в предложении WHERE. Запрос вернет только пользователей, которые являются членами groupID = 1. Но я хочу, чтобы возвращалось значение null, если Джон не является членом этой группы.

Есть идеи, возможно ли это? Спасибо! Fab

1
Fab 30 Авг 2011 в 21:00

3 ответа

Лучший ответ

Вам нужно переместить условие table2.groupID = 1 из предложения WHERE в условия ON (в противном случае LEFT JOIN отменяется):

SELECT u.*
     , ug.groupID 
FROM table1 AS u
  LEFT JOIN table2 AS ug 
    ON  ug.userID = u.userID 
    AND ug.groupID = 1
WHERE u.userName = 'John' 

Другой вариант - это подход (похожий на LEFT JOIN):

SELECT *
     , ( SELECT ug.groupID
         FROM table2 AS ug 
         WHERE ug.userID = u.userID 
           AND ug.groupID = 1
       ) AS groupID
FROM table1 AS u
WHERE userName = 'John' 
1
ypercubeᵀᴹ 30 Авг 2011 в 18:06

Вы должны переместить часть WHERE в JOIN

SELECT * 
FROM table1 t1 
LEFT JOIN table2 t2 
    ON t1.userID = t2.userID 
    And userName = 'John' 
    AND groupID = 1

изменить Я создал собственные данные. Попробуй это

With Users as
(
    Select 1 UserId, 'John' UserName
    Union Select 2, 'Tom'
),
Groups as
(
    Select 1 GroupId, 'Admin' GroupName
    Union Select 2, 'Power Users'
    Union Select 3, 'Users'
),
UserGroups as
(
    Select 1 UserId, 1 GroupId
    Union Select 2, 1
    Union Select 2, 3
)
Select *
From Groups
    Left Join (UserGroups
    Inner Join Users
        On Users.UserId = UserGroups.UserId
        And UserName = 'John'
        )
    On Groups.GroupId = UserGroups.GroupId

Полученные результаты:

GroupId     GroupName   UserId      GroupId     UserId      UserName
----------- ----------- ----------- ----------- ----------- --------
1           Admin       1           1           1           John
2           Power Users NULL        NULL        NULL        NULL
3           Users       NULL        NULL        NULL        NULL
1
Raj More 30 Авг 2011 в 17:41

Вероятно, вы захотите это сделать:

SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.userID = t2.userID
WHERE userName = 'John'
HAVING groupID = 1 OR groupID IS NULL
ORDER BY groupID DESC
LIMIT 1
0
Robert Martin 30 Авг 2011 в 17:49