2012-07-09 89 views
1

我有以下數據庫。一位用戶可以撰寫一篇或多篇文章。投票是多對多的。需要MySQL數據庫的複雜sql查詢

用戶寫一篇文章。任何人都可以投票,因此投票將保存在投票表中。

我需要顯示頁面上的所有帖子。在每篇文章中,需要顯示帖子的作者,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 

我試過各種組合,但我的大腦是不會工作。另外,如果有更好的方法來設計數據庫,那麼可以很容易地獲得上述內容。

+1

究竟是票表?就目前而言,似乎用戶可以爲任何帖子投票多次。 – 2012-07-09 18:09:24

+0

@GordonLinoff加入職位表和投票表,得到一個職位的總票數,然後再次加入投票表和投票表,以獲得用戶的總票數,但我剛剛迷失在中間。一直在嘗試一天,沒有運氣。 – WebNovice 2012-07-09 18:10:41

+0

@MarcB是的,任何人都可以在帖子上投票,並可以根據上表進行多次投票。實際上,我在投票表中有一個IP地址字段,它拒絕同一IP的多個投票。但這在這裏是無關緊要的。投票表中的每個記錄表示對該特定帖子投1票。 – WebNovice 2012-07-09 18:11:37

回答

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 
+0

'u.id as user_id'但用戶(u)表沒有提到。 – WebNovice 2012-07-09 18:30:11

+0

糟糕。我寫了「from」子句,忘記完成「select」部分。我現在編輯它,所以它是正確的。 – 2012-07-09 18:36:17

+0

非常感謝。認爲你做了兩個小錯別字。 'p.id = pv.id left outer join'應該是'on p.id = pv.post_id'和'group by v.user_id'應該是'group by p.user_id',因爲投票(v)沒有用戶名。無論如何,我改變了這些,它的工作。非常感謝你。像這樣的東西看起來對我來說無法解決,但對你來說很容易。你能指點我到哪裏,我可以多改善一點嗎? – WebNovice 2012-07-09 18:48:24

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 
+0

投票表中沒有'user_id',所以最後一行會引發錯誤。 – WebNovice 2012-07-09 18:27:58