1

結合でサブ選択を起動しようとしていますが、戻りに問題があります

SELECT * FROM user, follow
WHERE user.id IN ( SELECT follow FROM referent_follow WHERE referent=3 )

上記の場合、リターンは良好ですが、さらに、すべてのテーブルが望ましくないフォローをしています

SELECT * FROM user, follow
WHERE follow.user_id IN ( SELECT follow FROM referent_follow WHERE referent=3 )

上記の場合、戻り値は良好ですが、不要なすべてのテーブルユーザーが追加されています

それほどうまく機能しないクエリは最初のものですが、結果にもフォローの内容があります。

4

2 に答える 2

1

FROM A,Bは、A と B のクロス結合を意味します。つまり、A のすべての行がすべての行 B に一致します
(so totalRows = rowCount(A)*rowCount(B))。

を使用する(INNER) JOINとうまくいくはずです:

SELECT *
FROM user
JOIN follow ON user.id = follow.user_id
  AND user.id IN ( SELECT follow FROM referent_follow WHERE referent=3 )

JOINではなくを使用INすることをお勧めします。一般にパフォーマンスが向上するためです。

SELECT user.*, follow.*
FROM user
JOIN follow ON user.id = follow.user_id
JOIN referent_follow ON user.id = referent_follow.follow
WHERE referent=3

DISTINCTJWが提案したように、も必要になる場合があります。

于 2013-03-30T10:19:17.740 に答える
1

現在のクエリでは、 と の両方のテーブルからデカルト積が返されuserますfollow。接続されたレコードを結合して除外する条件を指定する必要があります。

SELECT  DISTINCT a.*, b.* 
FROM    user a
        INNER JOIN follow b
            ON a.ID = b.user_id 
        INNER JOIN referent_follow c
            ON a.ID = c.follow
WHERE   c.referent = 3
于 2013-03-30T10:19:44.207 に答える