2016-09-29 2 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 (отдельный v.Number, v.AlbumID)' недопустимо. –

+0

На самом деле я понял, что пользователь ** не может ** голосовать за одну и ту же песню несколько раз из-за ПК в * Голосование *: D Итак, я думаю, у меня нет проблемы. Но все же вы помогли с подсчетом * (отличным ...) *. – Eutherpy