Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL复杂的select语句_Mysql_Sql - Fatal编程技术网

Mysql SQL复杂的select语句

Mysql SQL复杂的select语句,mysql,sql,Mysql,Sql,我试图创建一个SELECT语句,但我不确定如何实现它 我有两个表,user和group。每个用户都有一个userid,每个组都有一个指定组所有者的ownerid。每个组也有一个名称,然后在用户表中,有一列组指定此人所属的组。(请原谅这个恼人的结构,我没有创建它)。我正在尝试查找组中该组的所有者ID未将组(在用户表内)设置为该组的名称的所有行。如果这有帮助: 用户 |-----------------------| | id | username | group | |----|-----

我试图创建一个SELECT语句,但我不确定如何实现它

我有两个表,
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
有主键吗?是的,有。我只需要复制输出,将其转换为数组,然后从那里执行,因为我从来没有弄清楚为什么它是只读的。谢谢你的帮助,非常感谢。