SQL复杂的select语句

时间:2014-01-25 04:17:04

标签: mysql sql

我正在尝试创建一个SELECT语句,但我不确定如何完成它。

我有2个表,usergroup。每个用户都有一个userid,每个组都有一个ownerid,用于指定该组的拥有者。每个组也有一个name,然后在用户表中,有一列group指定该人所属的组。 (原谅令人讨厌的结构,我没有创建它)。我正在尝试查找groupownerid的所有行,其中该组的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。

3 个答案:

答案 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)