2017-02-21 18 views
0

私はこれらのテーブルを持っている:SQL:選択クエリ

  • メンバー(IdMember、名前、nbFollower)
  • フォロワー(IdMember、IdFollower、日付)
  • フレンド(IdMember、IdFriend)
  • 写真(IdPhoto、datePhoto、IdMember)
  • コメント(IdPhoto、IdMember、なし、コンテンツ)
  • 同様(IdPhoto、IdMember)

なしは、私が同じ写真に3つ以上のコメントを残したメンバーの名前を選択したい写真

のメンバーによって書かれたコメントのオーダーです。

私はこれをしなかったが、それは動作しません:

SELECT name 
FROM MEMBER M, COMMENT C, PHOTO P 
WHERE M.IdMember = C.IdMember = P.IdMember 
    AND M.IdMember IN (SELECT IdMember 
        FROM COMMENT 
        GROUP BY IdMember 
        HAVING COUNT(no) >= 3) 

どのように私は私のクエリを変更できますか?

+1

[悪い習慣をキックする:使用して古いスタイルなJOIN](HTTP: //sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - その古いスタイル*コンマで区切られたテーブルのリスト*スタイルANSI - ** 92 ** SQL標準(** 25年前**)で*適切な* ANSI 'JOIN'構文に置き換えられ、その使用は推奨されません –

答えて

1

あなたのクエリは近いですが、あなたは両方メンバー写真でCommentテーブル内に集約する必要があります。これを試してみてください:

SELECT name FROM MEMBER M, COMMENT C, PHOTO P 
WHERE M.IdMember = C.IdMember = P.IdMember 
AND M.IdMember IN 
(
    SELECT IdMember 
    FROM Comment 
    GROUP BY IdMember, IdPhoto 
    HAVING COUNT(*) >= 3 
) 

しかし、実際に私はむしろ、明示的を使用して、このクエリを記述しますが、どこでも加入:

だけ列があなたから使用しているので、あなたが Photoテーブルに参加する必要はありません。この場合
SELECT name 
FROM MEMBER m 
INNER JOIN COMMENT c1 
    ON m.IdMember = c1.IdMember 
INNER JOIN PHOTO p 
    ON c1.IdMember = p.IdMember 
INNER JOIN 
(
    SELECT IdMember 
    FROM Comment 
    GROUP BY IdMember, IdPhoto 
    HAVING COUNT(*) >= 3 
) c2 
    ON c1.IdMember = c2.IdMember 
0

そのテーブルはIdPhotoで、その情報はすでにCommentのテーブルにあります。

Commentテーブルをもう一度読み込まなくても、サブクエリをMemberテーブルに直接参加させることもできます。

は、すでに述べたように、あなたもこれで試してみる 同じ写真

同じメンバーからポストの数をカウントするために、句によって、あなたのグループでIdPhotoを追加する必要があり、言った:

SELECT DISTINCT M.name 
    FROM MEMBER M, (SELECT IdMember 
       FROM COMMENT 
       GROUP BY IdMember, IdPhoto 
       HAVING COUNT(no) >= 3) C 
    WHERE M.IdMember = C.IdMember; 

またはANSI構文で:

SELECT DISTINCT M.name 
    FROM MEMBER M 
     INNER JOIN (SELECT IdMember 
       FROM COMMENT 
       GROUP BY IdMember, IdPhoto 
       HAVING COUNT(no) >= 3) C 
    ON M.IdMember = C.IdMember;