我正在尝试创建一个SELECT语句,但我不确定如何完成它。
我有2个表,user
和group
。每个用户都有一个userid
,每个组都有一个ownerid
,用于指定该组的拥有者。每个组也有一个name
,然后在用户表中,有一列group
指定该人所属的组。 (原谅令人讨厌的结构,我没有创建它)。我正在尝试查找group
中ownerid
的所有行,其中该组的group
没有name
(在用户表内)设置为该组的|-----------------------|
| id | username | group |
|----|----------|-------|
| 0 | Steve | night |
| 1 | Sally | night |
| 2 | Susan | sun |
| 3 | David | xray |
|-----------------------|
。如果这有帮助:
用户
|---------------------|
| ownerid | name |
|---------|-----------|
| 1 | night |
| 3 | bravo |
| 2 | sun |
|---------------------|
群组
bravo
SQL语句将返回{{1}}的组行,因为bravo的所有者没有将其组设置为bravo。
答案 0 :(得分:1)
这是对原始表的连接,然后是值的比较:
select g.*
from group g join
user u
on g.ownerid = id
where g.name <> u.group;
如果值可以是NULL
,则逻辑需要考虑到这一点。
答案 1 :(得分:1)
反连接是一种熟悉的模式:
SELECT g.*
FROM `Group` g
LEFT
JOIN `User` u
ON u.group = g.name
AND u.id = g.ownerid
WHERE u.id IS NULL
让我们解开一下。我们将从返回Group的所有行开始。然后,我们将使用User中的一行(或多行)“匹配”Group中的每一行。要被视为“匹配”,User.id
必须与Group.ownerid
匹配,User.group
值必须与Group.name
匹配。
“技巧”是消除我们找到匹配的所有行(这是WHERE子句的作用),并且只留下Group
中没有匹配的那些行。
使用NOT EXISTS谓词获取等效结果的另一种方法
SELECT g.*
FROM `Group` g
WHERE NOT EXISTS
( SELECT 1
FROM `User` u
WHERE u.group = g.name
AND u.id = g.ownerid
)
这是使用相关的子查询;它的执行速度通常不如连接速度快。
请注意,如果您在Group中的行中的ownerid值不在用户表中,则这些结果可能会返回与Gordon Linoff的查询略有不同的结果。
答案 2 :(得分:0)
SELECT G.*
FROM Group AS G
WHERE G.Name NOT IN (SELECT DISTINCT U.Group FROM User AS U)