Не работает запрос к MqSQL

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
ida
проходил мимо

Не работает запрос к MqSQL

Непрочитанное сообщение ida » 2008-01-26 12:34:03

Есть такой код, но он не работает. Что я делаю не правильно?

Код: Выделить всё

$rating = mysql_query("SELECT *, MAX(rating*voices*1000+hits) AS koeff 
FROM articles WHERE old_mess = 'old' 
GROUP BY id_category 
HAVING MAX(koeff) 
ORDER BY rating DESC, voices DESC, hits DESC LIMIT 10");
Этим запросом я хочу для каждой категории статей (id_category), используя формулу, определить лучшую, а потом вывести лучшую десятку в соответствующем порядке. Подскажите, плиз, как решить мою задачу.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35466
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Не работает запрос к MqSQL

Непрочитанное сообщение Alex Keda » 2008-01-26 13:06:36

либо структуру таблицы показывай, либо ошибку которую выдаёт...
Убей их всех! Бог потом рассортирует...

ida
проходил мимо

Re: Не работает запрос к MqSQL

Непрочитанное сообщение ida » 2008-01-27 1:06:34

lissyara писал(а):либо структуру таблицы показывай, либо ошибку которую выдаёт...
Запрос выполняется, ошибку не выдает (если вывести на экран mysql_error()). Но в конечном результирующем списке отсутствуют некоторые статьи (в том числе и та, что явно должна быть на первом месте, т.е. максимальный рейтинг + за нее больше всего проголосовало и т.д.). Судя по этому списку для некоторых категорий неправильно определяется лучшая статья.
P.S. Если убрать из запроса LIMIT 10 - список вообще не выводится,

А если через phpMyAdmin послать запрос, то ругается на синтаксис:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"SELECT *, MAX(rating*voices*1000+hits) AS koeff
FROM sites WHE

IDA
проходил мимо

Re: Не работает запрос к MqSQL

Непрочитанное сообщение IDA » 2008-01-28 1:16:04

Понятно, что из-за апострофов ругается, но и с ними список все равно выводит не верно. Причем заметил, что мой запрос для каждой категории выдает самую старую статью и просто подставляет ей лучший для категории koeff. Как такое может быть?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Не работает запрос к MqSQL

Непрочитанное сообщение zg » 2008-01-28 13:05:04

Этим запросом я хочу для каждой категории статей (id_category), используя формулу, определить лучшую, а потом вывести лучшую десятку в соответствующем порядке. Подскажите, плиз, как решить мою задачу.
сколько тебе статей нужно - 10 лучших всего? или 10 в каждой категории?

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

Re: Не работает запрос к MqSQL

Непрочитанное сообщение BlackCat » 2008-01-28 14:36:08

IDA писал(а):Причем заметил, что мой запрос для каждой категории выдает самую старую статью и просто подставляет ей лучший для категории koeff. Как такое может быть?
Это не ошибка СУБД, это запрос такое творит. Разберите запрос сами по порядку.
1. Из всех статей выбираются подходящие условию WHERE old_mess = 'old'.
2. Применяется "GROUP BY id_category", т.е. выбраные статьи разбиваются на группы.
2.1. Важно! Далее в ответе будет по одной строке на каждую группу.
3. Для каждой группы расчитывается "MAX(rating*voices*1000+hits)". И тут самое интересное, нет условия выбирающего определенную статью из группы по этому в ответ на "*" будет подставлены поля для самой первой записи в группе, т.е. самой старой ;-)
4. К тому, что получилось применяется сортировка и выбираются верхние 10 записей.

Строка "HAVING MAX(koeff)" не будет имееть особого смысла, в HAVING как и в WHERE должно стоять условие, а "MAX(koeff)" условием не является. К тому же HAVING применяется для отбора групп по определенному условию.
=====
Для получения необходимого результата вам необходимо 2 запроса (или использование подзапросов):
- первый определит максимальный коэффициент в группе,
- второй найдет статью с таким коэффициентом.

Более подробно сдесь http://www.mysql.ru/docs/man/.

IDA
проходил мимо

Re: Не работает запрос к MqSQL

Непрочитанное сообщение IDA » 2008-01-29 0:08:16

BlackCat, большое спасибо вам за подробное объяснение. Моя ошибка теперь мне понятна и исправлена. Задача решена - тему можно закрыть.