首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql中的Intersect或Minus

mysql中的Intersect或Minus
EN

Stack Overflow用户
提问于 2013-10-27 15:56:43
回答 4查看 154关注 0票数 0

我有以下问题,

代码语言:javascript
复制
SELECT DISTINCT (U.uid)
FROM users U
    ,friends F
WHERE U.STATUS = '1'
    AND U.uid = F.friend_two
    AND F.friend_one = '1'
    AND F.ROLE = 'fri'

上面的查询返回32行。

代码语言:javascript
复制
SELECT DISTINCT (U.uid)
FROM users U
    ,friends F
WHERE U.STATUS = '1'
    AND U.uid = F.friend_one
    AND F.friend_two = '1'
    AND F.ROLE = 'fri'

上面的查询返回15行。

我需要组合并取得相交的结果。相交的行是14行(意味着两个表中相同的U.uid是14行)

EN

回答 4

Stack Overflow用户

发布于 2013-10-27 16:11:33

试试这个:

代码语言:javascript
复制
SELECT *
FROM (
    SELECT DISTINCT (U.uid) UID
    FROM users U
        ,friends F
    WHERE U.STATUS = '1'
        AND U.uid = F.friend_two
        AND F.friend_one = '1'
        AND F.ROLE = 'fri'
    ) A
INNER JOIN (
    SELECT DISTINCT (U.uid) UID
    FROM users U
        ,friends F
    WHERE U.STATUS = '1'
        AND U.uid = F.friend_one
        AND F.friend_two = '1'
        AND F.ROLE = 'fri'
    ) B ON A.UID = B.UID

正如您所指定的,这基本上是两个查询的两个结果集的用户id的交集。

票数 1
EN

Stack Overflow用户

发布于 2013-10-27 16:13:39

获得交集的最直接方法是简单地连接查询:

代码语言:javascript
复制
SELECT uid FROM (
  SELECT DISTINCT U.uid
  FROM   users U JOIN friends F ON F.friend_two=U.uid AND F.friend_one = '1'
  WHERE  U.status='1' AND F.role='fri'
) NATURAL JOIN (
  SELECT DISTINCT U.uid
  FROM   users U JOIN friends F ON F.friend_one=U.uid AND F.friend_two = '1'
  WHERE  U.status='1' AND F.role='fri'
)

但是,您也可以组合查询并过滤分组的结果:

代码语言:javascript
复制
SELECT   U.uid
FROM     users U JOIN friends F ON (
           F.friend_one = U.uid AND F.friend_two = '1'
         ) OR (
           F.friend_two = U.uid AND F.friend_one = '1'
         )
WHERE    U.status='1' AND F.role='fri'
GROUP BY U.uid
HAVING   SUM(F.friend_one = U.uid AND F.friend_two = '1')
     AND SUM(F.friend_two = U.uid AND F.friend_one = '1')
票数 1
EN

Stack Overflow用户

发布于 2013-10-27 16:39:01

如果您使用EXISTS而不是joins重写这两个查询,您可以首先删除DISTINCT (这里假设uidUsers的主键),其次,INTERSECTEXCEPT (也称为MINUS)操作是清晰的:

查询1:

代码语言:javascript
复制
SELECT U.uid
FROM users U
WHERE U.status = '1'
  AND EXISTS
      ( SELECT *
        FROM friends F
         WHERE U.uid = F.friend_two
           AND F.friend_one = '1'
           AND F.ROLE = 'fri'
      ) ;

查询2:

代码语言:javascript
复制
SELECT U.uid
FROM users U
WHERE U.status = '1'
  AND EXISTS
      ( SELECT *
        FROM friends F
         WHERE U.uid = F.friend_one
           AND F.friend_two = '1'
           AND F.ROLE = 'fri'
      ) ;

查询3: INTERSECT

代码语言:javascript
复制
SELECT U.uid
FROM users U
WHERE U.status = '1'
  AND EXISTS
      ( SELECT *
        FROM friends F
         WHERE U.uid = F.friend_two
           AND F.friend_one = '1'
           AND F.ROLE = 'fri'
      )
  AND EXISTS
      ( SELECT *
        FROM friends F
         WHERE U.uid = F.friend_one
           AND F.friend_two = '1'
           AND F.ROLE = 'fri'
      ) ;

查询4: EXCEPT (**MINUS**)

代码语言:javascript
复制
SELECT U.uid
FROM users U
WHERE U.status = '1'
  AND EXISTS
      ( SELECT *
        FROM friends F
         WHERE U.uid = F.friend_two
           AND F.friend_one = '1'
           AND F.ROLE = 'fri'
      )
  AND NOT EXISTS                       -- notice the NOT here
      ( SELECT *
        FROM friends F
         WHERE U.uid = F.friend_one
           AND F.friend_two = '1'
           AND F.ROLE = 'fri'
      ) ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19615861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档