2016-03-15 3 views
0

У меня есть 3 таблицы: пользователь, голос и песня.Использование нескольких операторов SQL внутри друг друга

песня содержит Песенка Vote содержит идентификатор песни, пользователь, кто голосовал и значение голосов пользователя содержит информацию о пользователе

Когда пользователь голосов на песню, их голос будет сохранен. Либо 1, либо 0. Каждая песня имеет жанр, который признается за голос.

То, что я пытаюсь сделать что-то вроде этого ...

Pop 1 
Rock 3 
Reggie 4 

Vote percent is the total amount of 1s received so 1, 3, 4. 
These as a % is my aim so Reggie would be 50%. (8/4) and so on... 
I then want to use this list of prefered genres to pick songs based on the % values. 

Так что, если есть какая-либо Реджи песня это будет возвращаемой первым в списке.

SELECT s.* FROM song s 
WHERE (
SELECT 100.00 * SUM(CASE WHEN vote = '1' THEN 1 WHEN vote = '2' THEN 0.5 
         ELSE 0 END)/COUNT(v.vote) AS votePercent 
         FROM song s 
         LEFT JOIN collaborate c 
         ON s.song_id = c.song_id 
         LEFT JOIN voting v 
         ON s.song_id = v.song_id 
         WHERE v.user_id = 'user0d1c-944f-4fff-b819-16869750f2d4' 
         ) 
          GROUP BY s.genre; 

То, что я пытался до сих пор, кажется, от, как процентное значение выходит за 100% и 50% для жанров, а не в процентах от общего количества голосов.

Также мой текущий запрос почти наверняка вернет песни, которые уже были проголосованы.

Я пошла в неправильном направлении, или это имеет какое-то обещание для того, чего я надеюсь достичь?

+0

Это выполнимо. Можете ли вы отредактировать сообщение, чтобы перечислить структуры таблиц (т.е. типы данных)? Благодарю. –

ответ

0

Я думаю, что проблема в вашем group by, когда вы получаете COUNT(v.vote), это сгруппированный счет, а не общий счет.

попробовать это:

SELECT s.* FROM song s 
WHERE (
SELECT 100.00 * SUM(CASE WHEN vote = '1' THEN 1 WHEN vote = '2' THEN 0.5 
         ELSE 0 END)/(SELECT COUNT(*) FROM voting) AS votePercent 
         FROM song s 
         LEFT JOIN collaborate c 
         ON s.song_id = c.song_id 
         LEFT JOIN voting v 
         ON s.song_id = v.song_id 
         WHERE v.user_id = 'user0d1c-944f-4fff-b819-16869750f2d4' 
         ) 
         GROUP BY s.genre; 

Проблема, которая затем может возникнуть в том, что как граф и ваша сумма целые числа, так что MySQL может быть сбросив десятичные значения из результатов.

Чтобы исправить это, мы можем бросить SUM в виде десятичной дроби:

SELECT s.* FROM song s 
WHERE (
SELECT 100.00 * CAST(SUM(CASE WHEN vote = '1' THEN 1 WHEN vote = '2' THEN 0.5 
         ELSE 0 END) as DECIMAL(10,2)/(SELECT COUNT(*) FROM voting) AS votePercent 
         FROM song s 
         LEFT JOIN collaborate c 
         ON s.song_id = c.song_id 
         LEFT JOIN voting v 
         ON s.song_id = v.song_id 
         WHERE v.user_id = 'user0d1c-944f-4fff-b819-16869750f2d4' 
         ) 
         GROUP BY s.genre; 

Это проверялось, но я думаю, что это может направить вас в правильном направлении.

Смежные вопросы