Довольно сложно резюмировать мой вопрос в заголовке, так что он не полностью охвачен ... извините за это :)
Проблема заключается в следующем: у меня есть две таблицы, одна из которых является таблицей пользователей, а вторая - таблицей соединения, в которой содержится комбинация пользователей и групп.
У меня есть пользователи, которые могут подписаться на несколько групп, и я хочу иметь возможность проверять, является ли кто-то уже членом определенной группы. Я также хочу иметь возможность получать информацию о пользователях, независимо от того, является ли пользователь членом соответствующей группы.
Так что я:
Таблица 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
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'
Вы должны переместить часть 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
Вероятно, вы захотите это сделать:
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
Похожие вопросы
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.