2016-09-29 44 views
0

我有以下查詢:MySQL的語法錯誤:意外「獨一無二」

select u.UserName, count(*) as total 
from Voting v join User u using (UserID) 
where unique (select s.AlbumID, s.Number from Song s where s.AlbumID=v.AlbumID and s.Number=v.Number) 
group by u.UserName 
order by total desc; 

這應該做到以下幾點:爲每個用戶,顯示該用戶名和歌曲的用戶投票數。如果沒有where unique (...)這一行,這可以正常工作,但我希望同一首歌的投票不會被計爲多次投票,並且我不太確定如何執行此操作,因爲該行會產生語法錯誤(並且我的教科書中提到你可以這樣做:-))。

的模式是這樣的:

table Album(AlbumID(PK), AlbumName) 

table Song((Number,AlbumID)(PK), SongName) 

table User(UserID(PK), UserName) 

table Voting((UserID,AlbumID,Number)(PK),Vote,Date) 

回答

1

您需要在專輯中的用戶投票來算個不同的數字。爲此,請加入歌曲表格。

唯一不清楚的是,您如何知道用戶是否投票選擇了歌曲?是投票yes/no列嗎?如果是這樣,你可能不得不改變聚合。

select u.UserName, count(distinct v.Number) as total 
--count(distinct case when v.vote = 'yes' then 1 end) as total 
--use this if vote is a yes/no column. 
from Voting v 
join `User` u on u.userid=v.userid 
join Song s on s.AlbumID=v.AlbumID and s.Number=v.Number 
group by u.UserName 
order by total desc 
+0

但是,就我而言,歌曲是由AlbumID和該專輯上的數字定義的。如果我正確理解了這一點,則不會計算在不同專輯中具有相同編號的歌曲的投票數。我可以將* distinct *用於AlbumID和Number嗎?類似* count(不同v.Number,v.AlbumID)*?附: *投票*是一個數字:) – Eutherpy

+0

你可以發佈一些示例數據或設置一個sql小提琴嗎?使用'count(distinct v.Number,v.AlbumID)'是無效的。 –

+0

其實我意識到一個用戶**不能**因爲*投票*中的PK而多次爲同一首歌曲投票:所以我想我沒有問題。但是,你仍然幫助* count(distinct ...)*。 – Eutherpy