Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Подсчет и вывод лидеров голосования (ORDERBY) (Александр) 14/03/2011 - 13:16:01
      Re: Подсчет и вывод лидеров голосования (ORDERBY) (Akina) 14/03/2011 - 18:27:26

> Original message text:
> From: Александр - 14/03/2011 - 13:16:01
> Subject:Подсчет и вывод лидеров голосования (ORDERBY)
> -----------------
> Здравствуйте.
>
> Возникла проблемка с выводом лидеров голосований за определенный период, вобщем есть таблица votingapi_vote:
>
> content_id // id объекта за который отдан голос
> value // сам голос, значения 100,80,60,40,20
> timestamp // точка времени (1291167629)
>
> Для определения пятерки лидеров делаю следующий запрос:
>
> SELECT content_id, count( content_id ) AS vote_count, (SUM( value ) / count( content_id ) ) AS vote_result
> FROM votingapi_vote
> WHERE timestamp BETWEEN '1298869200' AND '1299387600'
> GROUP BY content_id
> ORDER BY vote_result DESC, vote_count DESC
> LIMIT 5
>
> В результате получил:
> content_id vote_count vote_result
> 158 1 100
> 80 1 100
> 119 1 100
> 170 1 100
> 120 1 100
>
> Что совсем не соответствует правде, на основе результата сделал вывод, что поля vote_count не подключается к сортировке результата. Погуглив немного по форуму на тему сортировки так и не нашел работающего варианта, пробовал варианты с подзапросом, расчет данных в самой сортировке, так и не сумел правильно отсортировать, единственный вариант который явно прокатил таков:
>
> SELECT * FROM (
>
> SELECT content_id, count( content_id ) AS vote_count, (SUM( value ) / count( content_id ) ) AS vote_result
> FROM votingapi_vote
> WHERE timestamp BETWEEN '1298869200' AND '1299387600'
> GROUP BY content_id
>
>
> ) as voting
> WHERE voting.vote_count > 1 AND voting.vote_result < 100
> ORDER BY voting.vote_result DESC, voting.vote_count DESC
> LIMIT 5
>
> Но он больше похож на костыль нежели правильную сортировку, о правильной знаю наверняка, так как у меня есть ещё одна таблица кеша с результатами расчетов по общему числу голосов (без периода), так хранятся только данные средней суммы и количества голосов для каждого content_id, так вот там ORDER BY vote_result DESC, vote_count DESC работает наура.
>
> Подскажите как всеже правильно сделать ORDER BY при таких условиях ???
>
>


From: Akina - 14/03/2011 - 18:27:26
Subject:Подсчет и вывод лидеров голосования (ORDERBY)
-----------------
Всё правильно, в ORDER BY нельзя использовать имена полей с агрегатными функциями. Но можно использовать порядковые номера полей выборки:

SELECT content_id, count( content_id ) AS vote_count, (SUM( value ) / count( content_id ) ) AS vote_result
FROM votingapi_vote
WHERE timestamp BETWEEN '1298869200' AND '1299387600'
GROUP BY content_id
ORDER BY 3 DESC, 2 DESC
LIMIT 5


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
38081



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |