Страница 1 из 1

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

Добавлено: 2008-01-26 12:34:03
ida
Есть такой код, но он не работает. Что я делаю не правильно?

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

$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), используя формулу, определить лучшую, а потом вывести лучшую десятку в соответствующем порядке. Подскажите, плиз, как решить мою задачу.

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

Добавлено: 2008-01-26 13:06:36
Alex Keda
либо структуру таблицы показывай, либо ошибку которую выдаёт...

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

Добавлено: 2008-01-27 1:06:34
ida
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

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

Добавлено: 2008-01-28 1:16:04
IDA
Понятно, что из-за апострофов ругается, но и с ними список все равно выводит не верно. Причем заметил, что мой запрос для каждой категории выдает самую старую статью и просто подставляет ей лучший для категории koeff. Как такое может быть?

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

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

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

Добавлено: 2008-01-28 14:36:08
BlackCat
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/.

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

Добавлено: 2008-01-29 0:08:16
IDA
BlackCat, большое спасибо вам за подробное объяснение. Моя ошибка теперь мне понятна и исправлена. Задача решена - тему можно закрыть.