MySQL中一对多关系的数据提取

MySQL中一对多关系的数据提取,mysql,Mysql,我有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'; 从用户中选择* 用

我有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';
从用户中选择*
用户组上的内部加入用户组。用户id=用户。用户id
用户\u group.group\u id=groups.group\u id上的内部联接组
其中,组。名称为“数学”;

但它会针对所有用户返回多条记录。假设,如果我有用户John,他加入了3个组:科学、数学和英语。在本例中,它将返回两条用户John的记录。我想从列表中完全删除用户John。

您可以使用
不存在

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');

如果要使用联接来执行此操作,则以下是一种方法:

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

它根据组返回用户的多个条目。e、 g.约翰与团体科学和约翰与团体英语。基本上,我想从列表中完全删除用户john。
SELECT * FROM users 
LEFT JOIN user_group ON user.UserID = user_group.user_id
LEFT JOIN groups ON user_group.group_id = groups.group_id
WHERE groups.Name != 'Mathematics';