1

私は次のデータベースを持っています。1人のユーザーが1つ以上の投稿を書くことができます。投票は多対多です。

ユーザーが投稿を書き込みます。誰でも投稿に投票できるため、投票は投票テーブルに保存されます。

ページにすべての投稿を表示する必要があります。各投稿には、投稿の作成者、post_votes、および作成者の投票を表示する必要があります。

私のテーブルは次のとおりです。

Table: user

id | user_name
1  | John
2  | Sam
3  | Susan

Table: post

id | post_title | user_id
1  | Hello      | 1
2  | Sunday     | 1
3  | Monday     | 2
4  | Sun        | 1
5  | Sun        | 3


Table: votes

id | post_id

1  |  1
2  |  1
3  |  3
4  |  2
5  |  3
6  |  1

次の結果セットを返すクエリが必要です。

post_id | post_votes | user_id | user_votes
1       | 3          | 1       | 4 
2       | 1          | 1       | 4
3       | 2          | 2       | 2  
4       | NULL       | 1       | 4    
5       | NULL       | 3       | NULL

いろいろな組み合わせを試しましたが、脳が動かないだけです。また、上記を簡単に取得できるようにデータベースを設計するためのより良い方法があれば、非常にありがたいです。

4

2 に答える 2

1

これは少し複雑です。このような場合、多くの場合、集計された各列を個別に計算する必要があります。この場合、1つのサブクエリを使用して投稿の数を取得し、別のサブクエリを使用してユーザーの数を取得します。

select p.post_id, pv.post_votes, uv.user_id, uv.user_votes
from post p left outer join
     (select v.post_id, count(*) as post_votes
      from votes v
      group by v.post_id
     ) pv
     on p.id = pv.id left outer join
     (select p.user_id, count(*) as user_votes
      from votes v join
           post p
           on p.id = v.post_id
      group by p.user_id
     ) uv
     on p.user_id = uv.user_id
于 2012-07-09T18:13:26.450 に答える
0
SELECT
  post.id,
  post.user_id,
  post_votes.total,
  user_votes.total
FROM
  post
LEFT JOIN
  (SELECT post_id, COUNT(*) as total FROM votes GROUP BY post_id) AS post_votes
    ON post_votes.post_id = post.id
LEFT JOIN
  (SELECT user_id, COUNT(*) as total FROM votes GROUP BY user_id) AS user_votes
    ON user_votes.user_id = post.user_id
于 2012-07-09T18:13:54.187 に答える