2013-08-27 222 views
0

這裏是我的表佈局複雜MySQL的Select查詢

[在這裏輸入的形象描述] [1]

我想這樣做:

  1. 計數的votes數對於特定房間中的每個songID(作爲參數傳入)。
  2. 找出用戶ID是否對特定房間中的歌曲有至少一票投票。用戶ID也作爲參數傳入。
  3. 上述兩者的延伸。如果歌曲沒有投票,我想爲這些條目返回0。

我有什麼:

select a.SongID, count(*) as voteCount, b.UserID 
    from votes a left join votes b 
    on a.songID = b.songID 
    and b.RoomID = 178 
    and b.UserID = 71 
where a.RoomID = 178 
group by a.SongID, b.UserID 

(隨意使用這些RoomIDUserID號碼的例子)

上面的SQL語句做1和2,但不是3.是否有任何方式來擴展它做3?在單個查詢中完成所有這些將會很好。現在它將返回所有有投票的歌曲,投票數以及有問題的UserID已投票(否則爲空)。提前致謝。

編輯:只是爲了澄清一點,目前這個語句只會輸出歌曲在votes表項,即時通訊試圖修改它以包括沒有在votes表項(即,歌曲包括Select SongID from songs where RoomID = 178中的所有歌曲)。請注意,一切都是針對特定房間的。歌曲通過SongID與某個房間相匹配。

這裏是我的例如歌曲表:

+--------+--------+ 
| SongID | RoomID | 
+--------+--------+ 
| 2835 | 178 | 
| 2836 | 178 | 
| 2837 | 178 | 
| 2838 | 178 | 
| 2839 | 178 | 
| 2840 | 178 | 
| 2841 | 178 | 
| 2842 | 178 | 
| 2843 | 178 | 
| 2844 | 178 | 
| 2845 | 178 | 
| 2846 | 178 | 
| 2847 | 178 | 
| 2848 | 178 | 
+--------+--------+ 

這裏是投票:

+--------+--------+--------+ 
| SongID | UserID | RoomID | 
+--------+--------+--------+ 
| 2835 |  71 | 178 | 
| 2836 |  71 | 178 | 
| 2837 |  71 | 178 | 
| 2838 |  71 | 178 | 
| 2839 |  71 | 178 | 
| 2840 |  71 | 178 | 
| 2841 |  71 | 178 | 
| 2842 |  71 | 178 | 
+--------+--------+--------+ 

最後,查詢的結果我至今:
只有第一7首歌曲有票,只有那些返回。我想修改此查詢以包含房間中的所有歌曲,即使它們沒有投票(並將投票計數返回爲0或null)。

+--------+-----------+--------+ 
| SongID | voteCount | UserID | 
+--------+-----------+--------+ 
| 2835 |   1 |  71 | 
| 2836 |   1 |  71 | 
| 2837 |   1 |  71 | 
| 2838 |   1 |  71 | 
| 2839 |   1 |  71 | 
| 2840 |   1 |  71 | 
| 2841 |   1 |  71 | 
+--------+-----------+--------+ 
+0

你可以把你想要的輸出 – zxc

+0

如何'RoomID'在'與'RoomID songs' ''投票'? – peterm

+0

「歌曲」中的'RoomID'和'votes'中的'RoomID'都是「房間」中原始「RoomID」的外鍵。 –

回答

1

我相信你的查詢可能看起來像這樣

SELECT s.SongID, 
     COALESCE(v.allVotes, 0) allVotes, 
     COALESCE(v.userVotes, 0) userVotes 
    FROM songs s LEFT JOIN 
(
    SELECT SongId, 
     COUNT(*) allVotes, 
     SUM(CASE WHEN UserID = 71 THEN 1 ELSE 0 END) userVotes 
    FROM votes 
    WHERE RoomID = 178 
    GROUP BY SongID 
) v 
    ON s.songID = v.songID 
WHERE s.RoomID = 178 

下面是SQLFiddle演示

+0

[錯誤] 1064 - 你的SQL語法錯誤,檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「)userVotes FROM票 WHERE RoomID = 178 GROUP BY SongID )V 」列在原來的職位 –

+0

添加的文本數據這是錯字。抱歉。查看更新的答案。 –

+0

@johnhannigan 6個 – peterm