Mysql SQL复杂的select语句
我试图创建一个SELECT语句,但我不确定如何实现它 我有两个表,Mysql SQL复杂的select语句,mysql,sql,Mysql,Sql,我试图创建一个SELECT语句,但我不确定如何实现它 我有两个表,user和group。每个用户都有一个userid,每个组都有一个指定组所有者的ownerid。每个组也有一个名称,然后在用户表中,有一列组指定此人所属的组。(请原谅这个恼人的结构,我没有创建它)。我正在尝试查找组中该组的所有者ID未将组(在用户表内)设置为该组的名称的所有行。如果这有帮助: 用户 |-----------------------| | id | username | group | |----|-----
user
和group
。每个用户都有一个userid
,每个组都有一个指定组所有者的ownerid
。每个组也有一个名称
,然后在用户表中,有一列组
指定此人所属的组。(请原谅这个恼人的结构,我没有创建它)。我正在尝试查找组
中该组的所有者ID
未将组
(在用户表内)设置为该组的名称
的所有行。如果这有帮助:
用户
|-----------------------|
| id | username | group |
|----|----------|-------|
| 0 | Steve | night |
| 1 | Sally | night |
| 2 | Susan | sun |
| 3 | David | xray |
|-----------------------|
|---------------------|
| ownerid | name |
|---------|-----------|
| 1 | night |
| 3 | bravo |
| 2 | sun |
|---------------------|
集团
|-----------------------|
| id | username | group |
|----|----------|-------|
| 0 | Steve | night |
| 1 | Sally | night |
| 2 | Susan | sun |
| 3 | David | xray |
|-----------------------|
|---------------------|
| ownerid | name |
|---------|-----------|
| 1 | night |
| 3 | bravo |
| 2 | sun |
|---------------------|
其中,SQL语句将返回bravo的组行,因为bravo的所有者没有将其组设置为bravo。这是一个到原始表的连接,然后是值的比较:
select g.*
from group g join
user u
on g.ownerid = id
where g.name <> u.group;
选择g*
从g组加入
用户u
在g.ownerid=id上
其中g.名称u.集团;
如果值可以是NULL,那么逻辑需要考虑到这一点。反连接是一种常见的模式:
SELECT G.*
FROM Group AS G
WHERE G.Name NOT IN (SELECT DISTINCT U.Group FROM User AS U)
SELECT g.*
FROM `Group` g
LEFT
JOIN `User` u
ON u.group = g.name
AND u.id = g.ownerid
WHERE u.id IS NULL
让我们把它打开一点。我们将从返回组中的所有行开始。然后,我们将把组中的每一行与来自用户的一行(或多行)进行“匹配”。若要将其视为“匹配”,则User.id
必须匹配组.ownerid
,而User.Group
值必须匹配组.name
“诀窍”是删除找到匹配项的所有行(where子句就是这样做的),这样我们就只剩下组
中没有匹配项的行
使用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
)
这是使用相关子查询;它的执行速度通常不如连接
请注意,如果您在组中有一行的ownerid值不在用户表中,那么这些可能返回与Gordon Linoff的查询稍有不同的结果。SQL语句的bash在哪里?这似乎起到了作用,但出于某种原因,MySQL workbench告诉我输出行是只读的。(我假设is与分配组名称g有关?)有什么办法可以绕过这个问题吗?@user2249516。我不知道MySQL workbench为什么会说输出是只读的。一个原因是表上缺少主键。
group
有主键吗?是的,有。我只需要复制输出,将其转换为数组,然后从那里执行,因为我从来没有弄清楚为什么它是只读的。谢谢你的帮助,非常感谢。