2016-10-26 9 views
3

私の貧弱なレベルでは複雑すぎるように見えるmysqlクエリが残っています。 この問題を解決するための助けがあれば、非常に感謝します。
_メンバー:COUNT()をINNER/LEFT JOINと組み合わせて使用​​できない

私は3つのテーブルを持っているすべてのメンバー
_友人のリストを各メンバーが持っているすべての友達のリストを、2つのフィールドを使用して:friends.id_memberは、会員IDが含まれているとfriends.id_friendはのIDが含まれています対応する友人。
_コメント:メンバーにより投稿されたすべてのコメントのリスト(テーブルメンバーにこのテーブルを結合するために、フィールドcomments.id_memberを使用して)

私が希望:
_(1):メンバーが持つかもしれないすべての友達を表示します(この例では会員数35;それはうまく動作します)

SELECT friends.*, members.* 
    FROM friends 
    INNER JOIN members ON friends.id_friend=members.id 
    WHERE friends.id_member='35' 

_(2):同じmysqlのクエリを使用して、その友人のコメントそれぞれの数が投稿した可能性があります(すべての友人がコメントを掲載しているではない取得します;そしてここに私の問題です)。 Iこれを試してみました:

SELECT friends.*, members.*, 
    COUNT(comments.id_member) AS nb_comments 
    FROM friends 
    INNER JOIN members ON friends.id_friend=members.id 
    INNER JOIN comments ON comments.id_member=members.id 
    WHERE friends.id_member='35' 

- >私はコメントのみ掲載していた友人を得る(ここでなければなりませんノーコメントと友達が投稿し、このクエリによって無視される)、およびコメント(nb_comments)の数私は間違っている。 別のバグ。メンバーは友達が全くいない場合に1行を返します。

nb: 'LEFT JOIN comments ON comments.id_member = members.id'は何も解決しません。

答えて

1

私はあなたが欲しいと思うものを行うための一つの方法は、サブクエリを使用することです:あなたはSELECTCOUNT()を追加すると

SELECT f.*, m.*, 
     (SELECT COUNT(*) 
     FROM comments c 
     WHERE c.id_member = m.id 
     ) as nb_comments 
FROM friends f INNER JOIN 
    members m 
    ON f.id_friend = m.id 
WHERE f.id_member = 35; 

、あなたは集計クエリにクエリを回します。 GROUP BYがなければ、正確に1つの行が返されます。

注:

  • 表の別名を使用すると、それが簡単に書くことや読むことを作り、クエリを簡素化します。
  • 数値定数の周りに単一引用符を使用しないでください。私はid_memberが数字として宣言されていると仮定します。
  • 相関サブクエリは、各行にカウントを追加します。
  • 必要な列を明示的にリストする習慣を身に付ける必要があります。 2つのテーブルに同じ名前の列があると、予期しない結果が生じることがあります。
+0

ありがとうゴードン。あなたの答えは私の問題の解決された部分です:各友達のコメント数は正しくなり、メンバーに友人がいないときはクエリの結果は空になります。しかし、このクエリにはコメントのないすべての友人がまだいません(私は理由は分かりません)。 – Romain

+0

@Romain。 。 。メンバーに一致するすべての友人が含まれている必要があります。コメントがあるかどうかは、行が返されるかどうかに影響しません。 –

+0

私の間違い:私は、各友達のzip_codeとcityを取得するために、別のINNER JOINを持っていました。これを別のサブクエリに入れた後、すべてが魅力的に機能します。どうもありがとう !! – Romain

関連する問題