2011-01-10 12 views
5

私はmysqlで3つのテーブルを結合することに問題があります。mysqlの複数のテーブルを複数のテーブルに結合する方法

たちは、私はそれで私のエントリを保つpostsという名前のテーブルを持っていると言うことができます、私は私がでUSER_IDさんとpost_idの年代を保存likesという名前のテーブルと私はUSER_IDさんとpost_idの年代保存commentsという名前の3番目のテーブルとその中のコメントのテキストを持っています。

私のエントリのリストを取得し、各エントリの好き嫌いやコメントの数を取得するクエリが必要です。

このクエリを使用してイム:

SELECT posts.id, count(comments.id) as total_comments, count(likes.id) as total_likes 
FROM `posts` 
LEFT OUTER JOIN comments ON comments.post_id = posts.id 
LEFT OUTER JOIN likes ON likes.post_id = posts.id 
GROUP BY posts.id 

が、コメントは項目のために空になっている場合は、このクエリの問題は、そこにある、カウントはちょうどOKですが、エントリが2つのコメントと4を持っている場合は言うことができます好きlike、total_commentsとtotal_likesは両方とも "8"になります。つまり、mysqlはそれらを乗算します。 私は混乱しています。私は何をするのか分かりません。

ありがとうございました。

答えて

7

count(distinct comments.id)count(distinct likes.id)を使用します(ただし、これらのIDは一意です)。

+0

おかげで、魔法のように働きました。 – Sallar

4

まあこれはそれに近づくための一つの方法(MySQLが派生テーブルを許可すると仮定した場合)である:

SELECT posts.id, comments.total_comments, likes.total_likes 
FROM `posts` 
LEFT OUTER JOIN (select post_id, count(id) as total_comments from comments) comments 
    ON comments.post_id = posts.id 
LEFT OUTER JOIN (select post_id, count(id) as total_likes from likes) likes 
    ON likes.post_id = posts.id 

あなたはまた、相関サブクエリを使用することができます。一致するレコードがない場合は、0を入れることを考慮するケーススタントをinthereにすることができます。

はのは、相関サブクエリを試してみましょう:

SELECT posts.id, 
(select count(Id) from comments where post_id = posts.id) as total_comments, 
(select count(Id) from likes where post_id = posts.id) as total_likes 
FROM `posts` 
+0

ありがとうございますが、このクエリでは、最初のレコード(12のコメントと2つのコメントがあります)には12のお気に入りと2つのコメントが返され、他のすべての行にはNULLが返されました。 – Sallar

+0

は相関サブクエリのように見えますが、ルートは最高です – HLGEM

+0

私はそれらについて何も聞いていません。 – Sallar

関連する問題