我有3个表用户、用户组和组。
用户与组之间有一对多的关系。
如果我只想获取那些没有组数学的用户。
为此,我使用了以下查询:
SELECT * FROM users
INNER JOIN user_group ON user_group.user_id = user.UserID
INNER JOIN groups ON user_group.group_id = groups.group_id
WHERE groups.Name <> 'Mathematics';
但它正在返回所有用户的多条记录。假设,如果我有用户John和他加入了科学、数学和英语三个组。在本例中,它将返回用户John的两条记录。我想从列表中完全删除用户John。
最佳答案
您可以使用NOT EXISTS
:
SELECT *
FROM users AS u
WHERE NOT EXISTS (SELECT 1
FROM user_group AS ug
INNER JOIN groups AS g ON ug.group_id = g.group_id
WHERE ug.user_id = u.UserID AND g.Name = 'Mathematics');
Demo here
如果要使用联接来执行此操作,则可以这样做:
SELECT u.*
FROM users AS u
LEFT JOIN (
SELECT user_id
FROM user_group
INNER JOIN groups
ON user_group.group_id = groups.group_id AND groups.Name = 'Mathematics'
) AS g ON u.UserID = g.user_id
WHERE g.user_id IS NULL
Demo here
关于mysql - 在MySQL中存在一对多关系的情况下获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35449361/