Помогите разобраться с MAX, GROUP BY, HAVING...

Дмитрий_пхп

Новичок
Помогите разобраться с MAX, GROUP BY, HAVING...

Я хочу для каждой категории статей (id_category), используя формулу, определить лучшую, а потом вывести лучшую десятку в соответствующем порядке. Подскажите, плиз, как решить мою задачу. Делаю так:

$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) пределить лучшую
лучшую что? статью или категорию? Если категорию, то какой может быть вообще "список статей"? если статью, то че ты там группируешь то?
 
лучшую что? статью или категорию? Если категорию, то какой может быть вообще "список статей"? если статью, то че ты там группируешь то?
Хочу для каждой категории определить лучшую статью. Для этого группирую статьи по категории и определяю для каждой категории лучшую статью (исходя из формулы). Т.е. статья с максимальным значением по формуле и есть нужная мне статья.

Я неправильно запрос составил?
 
а это не из-за
WHERE old_mess = 'old'
некоторы статьи отсутствуют?
Из-за этого точно нет. Все новые статьи добавляются в базу со значение поля old_mess = 'new'. После прохождения модерации оно заменяется на 'old'. Сейчас в базе только старые статьи.
 
Формула расчета лучшей статьи для категории пока прикидочная. В том виде как есть сейчас, на мой взгляд, может неправильно выдать лучшую десятку. Я просто перестраховался.

Судя по всему мой запрос для каждой категории выдает самую старую статью и просто подставляет ей лучший для категории koeff. Может такое быть?
 
Дмитрий_пхп
а ты начни с этого и постепенно добавляй что тебе надо... а если и это неправильно работает, значит надо переделывать запрос в корне
PHP:
$rating = mysql_query("SELECT *, MAX(rating) AS koeff
FROM articles
GROUP BY id_category");
 
интересно, а нафига нужен изврат с new, old ?
Почему нельзя запихать в интегер тип с длинной в один символ?

-~{}~ 28.01.08 01:09:

А почему сортируешь не по koeff?
+1
 
Автор оригинала: Beavis
Дмитрий_пхп
а ты начни с этого и постепенно добавляй что тебе надо... а если и это неправильно работает, значит надо переделывать запрос в корне
PHP:
$rating = mysql_query("SELECT *, MAX(rating) AS koeff
FROM articles
GROUP BY id_category");
Уже на этом этапе неправильно работает. Для самой старой статьи, за которую еще вообще никто не проголосовал, ставит максимальный балл.

интересно, а нафига нужен изврат с new, old ?
Почему нельзя запихать в интегер тип с длинной в один символ?
В чем преимущество такого способа?
 
Дмитрий_пхп
Уже на этом этапе неправильно работает. Для самой старой статьи, за которую еще вообще никто не проголосовал, ставит максимальный балл.
На самом деле, все работает правильно. То есть так, как и должно. Другое дело, что этот запрос и не должен выдавать результат, который тебе требуется.
 
Gas
А если сделать поле ENUM('old', 'new') будет существенное отличие от поля типа INT?
 
Bitterman
только не int, а tinyint или boolen.
Честно говоря, тестов не проводил. Но не думаю что разница будет существенная.
Хотя лично, enum почти не юзаю, иногда на ror пишу, там в миграциях enum нет.
Скорее, дело предпочтений чем какие-то объективные факторы.
 
Gas
Ну да, наверно, в предпочтениях. Просто, на мой взгляд, если у нас всего два варианта, то можно использовать и 0/1, а если больше, то потом в конце концов запутаешься, что означает 0, что - 1, а что - 2 и т. д.. Поэтому предпочитаю использовать ENUM.
 
Спасибо за ответы. Теперь понятно в чем была моя ошибка. Задача решена - тему можно закрыть.
 
Сверху