2011-10-07 20 views
0

私は3種類のテーブルを持っています:複数のテーブルからデータを取得するSQL

メッセージ、コメントとアバター。

私がしたいことは次のとおりです: メッセージ内のすべてのメッセージを数え、コメントを数え、各ユーザーのアバターを表示します。

これは、テーブルが構築されている方法です。

メッセージ - > messages_id、user_idは、タイトル、メッセージ

コメント - > comments_id、messages_id、

アバターコメント - > avatar_id、USER_IDを、アバターを

私は次のことを試してみました:

SELECT *, COUNT(comments.comments_id) AS commentCount 
FROM messages 
LEFT JOIN comments ON messages.messages_id = comments.messages_id 
LEFT JOIN avatar on messages.user_id = avatar.user_id 

しかし、私はメッセージのための1つの行を取得し、残りは表示されません。

ここで間違っているのは何ですか?

SELECT messages_id 
     , title 
     , message 
     , user_id 
     , avatar_id 
     , avatar 
     , count(*) as commentCount 
    FROM messages 
    inner join avatar on messages.user_id = avatar.user_id 
    left join comments on messages.messages_id = comments.messages_id 
GROUP BY messages_id 

場合、これは動作するはずです:あなたはGROUP BYを使用する必要が

答えて

1

  • messages_idmessages
  • user_idにユニークですがavatar

で一意であるそうでなければ特別にする必要がある取得したい値を入力してください。

編集:

私は、すべてのユーザーがアバターを有することを考えavatarテーブルに対してinner joinを書きました。これが当てはまらない場合は、ご質問の中でleft joinのようにしてください。

てみセカンド

はたぶんエラーがgroup bymessages.messages_idの代わりmessages_idでなければならないことでした。

ERROR: column reference "messages_id" is ambiguous

私はより正確にするつもりです:

SELECT m.messages_id as id 
     , min(m.title)  as title 
     , min(m.message) as message 
     , min(m.user_id) as user_id 
     , min(a.avatar_id) as avatar_id 
     , min(a.avatar) as avatar 
     , count(c.comments_id) as commentCount 
    FROM messages as m 
    left join avatar as a on m.user_id = a.user_id 
    left join comments as c on m.messages_id = c.messages_id 
GROUP BY m.messages_id 

あなたが唯一の価値があると確信している場合、すべてminは、MySQLで削除される可能性があり、実際には他の人には、これは誤りであるRDMBS 。標準SQLでは、必要な値を選択する必要があります。唯一の値がある場合はminまたはmaxと入力します。

アバターとの参加をleft joinに変更しました。すべてのユーザーがアバターを持っているとは限りません。

+0

返信いただきありがとうございます。しかし、私は自分のデータベースにある2つのメッセージの代わりに、ただ1つのメッセージしか受け取っていません。 Messages_idは実際にはメッセージ内で一意であり、user_idはアバターで一意です。 多分、すべてのメッセージにコメントがあるわけではないことを指定する必要があります。 – moonwalker

+0

@moonwalkerは、私が書いた2番目のクエリを確認します。テーブルデータ、予想される出力、実際の出力の例があればうまくいかない場合は参考になります。 – DavidEG

+0

Davidに感謝します。 2番目の解決策は素晴らしいです。私はそれを勉強し、私が間違っていたことを理解しようとします。 – moonwalker

関連する問題