2013-07-16 2 views
0

У меня есть небольшая проблема с расширенным запросом, с которым я изо всех сил пытаюсь разобраться.COUNT() с нулями, внутри подзапроса

Существенно, что в таблице голосов есть голоса, соответствующие данному саундтреку. Мой запрос должен получить звание саундтрека на основе голосов, которые он получил.

Мой подход ниже работает очень хорошо, когда в таблице присутствуют голоса, но ранг присваивается значение NULL, когда его нет.

Вот запрос:

SELECT soundtrack.*, 
     (SELECT WrappedQuery.rank 
     FROM (SELECT @rownum := @rownum + 1 AS rank, 
         prequery.soundtrack_id 
       FROM (SELECT @rownum := 0) sqlvars, 
         (SELECT Count(*), 
           soundtrack_id 
         FROM vote 
         GROUP BY vote.soundtrack_id 
         ORDER BY Count(*) DESC) prequery) WrappedQuery 
     WHERE WrappedQuery.soundtrack_id = soundtrack.id) AS rank 
FROM soundtrack 
WHERE soundtrack.id = 33 
     AND live = 1 
ORDER BY rank ASC 

У меня есть чувство, проблема должна сделать с (SELECT COUNT(*)) части, но все, что я пытался до сих пор не получается.

Надеясь, что кто-то может пролить свет на мою проблему.

EDIT Вот SQLFiddle http://www.sqlfiddle.com/#!2/c8db2/2/0

ответ

3

ТОТ ХОРОШО:

SELECT soundtrack.*, 
(SELECT WrappedQuery.rank 
FROM (SELECT @rownum := @rownum + 1 AS rank, 
       prequery.soundtrack_id 
     FROM (SELECT @rownum := 0) sqlvars, 
       (
       SELECT COALESCE(COUNT(vote.soundtrack_id),0) AS no_rows, 
         soundtrack.id AS soundtrack_id 
       FROM soundtrack 
       LEFT JOIN vote ON soundtrack.id=vote.soundtrack_id 
       GROUP BY soundtrack.id 
       ORDER BY 1 DESC 
       ) prequery) WrappedQuery 
WHERE WrappedQuery.soundtrack_id = soundtrack.id) AS rank 
FROM soundtrack 
ORDER BY rank ASC; 

SEE: http://www.sqlfiddle.com/#!2/74698/2/0

+0

Я не пробовал это, но я имел эту идею без схемы .... – jaczes

+0

что работал с небольшим изменением. См. Мой вопрос. Спасибо. – freshnode

+0

Я боялся, что я ошибся, кто-то еще работал над данными и проголосовал, заставив запрос работать. Кто-нибудь еще? – freshnode

0

У меня было немного удачи рейтинга в своей работе, используя row_number функция. Но в противном случае функция coalesce может помочь вам.

SELECT soundtrack.*, rankquery.rank 
FROM (
    SELECT row_number() over(partition by prequery.soundtrack_id order by prequery.num_votes) as rank, 
    prequery.soundtrack_id 
     FROM (
      SELECT COALESCE(COUNT(*),0) as num_votes, soundtrack_id 
      FROM vote 
      GROUP BY soundtrack_id 
      ORDER BY num_votes DESC 
      ) prequery 
    ) rankquery 
INNER JOIN soundtrack 
rankquery.soundtrack_id = soundtrack.id 
WHERE soundtrack.id = 33 
     AND live = 1 
ORDER BY rank 
+0

Привет, получая синтаксическую ошибку от этого, любые идеи? – freshnode

+0

В частности: '# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования около '(раздел по предзагрузке.soundtrack_id order by prequery.num_votes) как rank, p' в строке 4 ' – freshnode

+0

Моя ошибка, MySQL не распознает row_number. Вы правильно используете переменную. См. Дополнительную запись. – tkendrick20

0
SELECT soundtrack.*, rankquery.rank 
FROM(
    SELECT prequery.*, @rownum := @rownum + 1 AS rank 
      (
      SELECT COALESCE(Count(*),0) as num_votes, 
        soundtrack_id 
      FROM vote 
      GROUP BY soundtrack_id 
      ORDER BY num_votes DESC 
      ) as prequery, 
      (SELECT @rownum := 0) as sqlvars 
    ) rankquery 
INNER JOIN soundtrack 
rankquery.soundtrack_id = soundtrack.id 
WHERE soundtrack.id = 33 
     AND soundtrack.live = 1 
ORDER BY rankquery.rank ASC 
+0

Там есть синтаксическая ошибка, и я не могу понять, где проблема? – freshnode

+0

Я немного переработал код, чтобы попробовать и разрешить синтаксическую ошибку. – tkendrick20

+0

Еще синтаксическая ошибка: вот sqlfiddle: http://www.sqlfiddle.com/#!2/c8db2/2/0 – freshnode

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