Помогите разобраться с 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");

Но, если делать так, то в конечном результирующем списке отсутствуют некоторые статьи (в том числе и та, что явно должна быть на первом месте, т.е. максимальный рейтинг + за нее больше всего проголосовало и т.д.). Судя по этому списку для некоторых категорий неправильно определяется лучшая статья.

В чем моя ошибка?
 

Андрейка

Senior pomidor developer
Я хочу для каждой категории статей (id_category) пределить лучшую
лучшую что? статью или категорию? Если категорию, то какой может быть вообще "список статей"? если статью, то че ты там группируешь то?
 

Дмитрий_пхп

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

Я неправильно запрос составил?
 

Дмитрий_пхп

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

Дмитрий_пхп

Новичок
Формула расчета лучшей статьи для категории пока прикидочная. В том виде как есть сейчас, на мой взгляд, может неправильно выдать лучшую десятку. Я просто перестраховался.

Судя по всему мой запрос для каждой категории выдает самую старую статью и просто подставляет ей лучший для категории koeff. Может такое быть?
 

Beavis

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

cDLEON

Онанист РНРСlub
интересно, а нафига нужен изврат с 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 ?
Почему нельзя запихать в интегер тип с длинной в один символ?
В чем преимущество такого способа?
 

Bitterman

Новичок
Дмитрий_пхп
Уже на этом этапе неправильно работает. Для самой старой статьи, за которую еще вообще никто не проголосовал, ставит максимальный балл.
На самом деле, все работает правильно. То есть так, как и должно. Другое дело, что этот запрос и не должен выдавать результат, который тебе требуется.
 

Bitterman

Новичок
Gas
А если сделать поле ENUM('old', 'new') будет существенное отличие от поля типа INT?
 

Gas

может по одной?
Bitterman
только не int, а tinyint или boolen.
Честно говоря, тестов не проводил. Но не думаю что разница будет существенная.
Хотя лично, enum почти не юзаю, иногда на ror пишу, там в миграциях enum нет.
Скорее, дело предпочтений чем какие-то объективные факторы.
 

Bitterman

Новичок
Gas
Ну да, наверно, в предпочтениях. Просто, на мой взгляд, если у нас всего два варианта, то можно использовать и 0/1, а если больше, то потом в конце концов запутаешься, что означает 0, что - 1, а что - 2 и т. д.. Поэтому предпочитаю использовать ENUM.
 

Дмитрий_пхп

Новичок
Спасибо за ответы. Теперь понятно в чем была моя ошибка. Задача решена - тему можно закрыть.
 
Сверху