0

以下の質問がありますが、

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​​ 行を返します。

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 行であることを意味します)

4

4 に答える 4

1

これを試して:

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

これは基本的に、2 つのクエリの 2 つの結果セットのうち、指定したユーザー ID の共通部分です。

于 2013-10-27T08:11:33.387 に答える
1

交差を取得する最も直接的な方法は、単純にクエリを結合することです。

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'
)

ただし、クエリを組み合わせて、グループ化された結果をフィルタリングすることもできます。

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')
于 2013-10-27T08:13:38.690 に答える
1

試してみる価値のある別の 2 つのバージョン。
1 つ目は半結合を使用し、2 つ目はfriendsテーブルをそれ自体に結合します。

SELECT distinct(U.uid) 
FROM users U
JOIN friends F  ON U.uid=F.friend_two AND F.friend_one='1'
WHERE U.status='1' AND F.role='fri' 
    AND EXISTS(
      SELECT 1 FROM friends F1
      WHERE U.uid=F1.friend_one 
        AND F1.friend_two='1'
        AND F1.role = 'fri'
    )
;

SELECT distinct(U.uid) 
FROM users U
JOIN friends F  ON U.uid=F.friend_two AND F.friend_one='1'
JOIN friends F1 ON U.uid=F1.friend_one AND F1.friend_two='1'
WHERE U.status='1' AND F.role='fri' AND F1.role = 'fri'
于 2013-10-27T08:55:43.317 に答える
1

EXISTS結合の代わりに2 つのクエリを書き直すと、最初に (ここでは主キーであるDISTINCTと仮定します) を削除し、次にand (とも呼ばれます) 操作を明確にできます。uidUsersINTERSECTEXCEPTMINUS

クエリ 1:

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:

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

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)

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'
      ) ;
于 2013-10-27T08:39:01.280 に答える