Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Не работает запрос к MqSQL
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Не работает запрос к MqSQL

Страниц (1): [1]
 

1. ida - 26 Января, 2008 - 11:31:48 - перейти к сообщению
Есть такой код, но он не работает. Что я делаю не правильно?

CODE (text):
скопировать код в буфер обмена
  1. $rating = mysql_query("SELECT *, MAX(rating*voices*1000+hits) AS koeff
  2. FROM articles WHERE old_mess = 'old'
  3. GROUP BY id_category
  4. HAVING MAX(koeff)
  5. ORDER BY rating DESC, voices DESC, hits DESC LIMIT 10");


Этим запросом я хочу для каждой категории статей (id_category), используя формулу, определить лучшую, а потом вывести лучшую десятку в соответствующем порядке. Подскажите, плиз, как решить мою задачу.
2. valenok - 26 Января, 2008 - 15:30:22 - перейти к сообщению
Может всё и правильно. Что именно не работает и как вы об этом узнали?
phpfaq.ru/debug
3. ida - 27 Января, 2008 - 00:02:47 - перейти к сообщению
valenok пишет:
Может всё и правильно. Что именно не работает и как вы об этом узнали?
phpfaq.ru/debug


Запрос выполняется, ошибку не выдает (если вывести на экран 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
4. valenok - 27 Января, 2008 - 20:06:01 - перейти к сообщению
апострофы поставьте фокруг названия полей и ругаться не будут.
5. ida - 27 Января, 2008 - 23:55:32 - перейти к сообщению
valenok пишет:
апострофы поставьте фокруг названия полей и ругаться не будут.


Да, с апострофами не ругается, но список все равно выводит не верно. Причем заметил, что мой запрос для каждой категории выдает самую старую статью и просто подставляет ей лучший для категории koeff. Как такое может быть?
6. valenok - 28 Января, 2008 - 15:49:52 - перейти к сообщению
Я бы написал что нибудь по проще.
CODE (text):
скопировать код в буфер обмена
  1.  
  2. SELECT *, MAX(`rating`*`voices`*1000 +`hits`) AS `koeff`
  3. FROM `articles` WHERE `old_mess` = 'old'
  4. GROUP BY `id_category`
  5. ORDER BY `koeff`  LIMIT 10
  6.  
7. ida - 28 Января, 2008 - 18:02:32 - перейти к сообщению
valenok пишет:

SELECT *, MAX(`rating`*`voices`*1000 +`hits`) AS `koeff`
FROM `articles` WHERE `old_mess` = 'old'
GROUP BY `id_category`
ORDER BY `koeff` LIMIT 10


Для каждой категории из БД выбираются отдельно максимальный коэффициет и совершенно не связанная с ним строка (произвольно).
Как можно связать коэффициент с нужной строкой? Какой нужен для этого запрос? Огорчение
8. ida - 28 Января, 2008 - 23:10:27 - перейти к сообщению
Задача решена - тему можно закрыть. Спасибо.
9. evgenijj - 29 Января, 2008 - 10:20:07 - перейти к сообщению
ida пишет:
Задача решена - тему можно закрыть. Спасибо.

Мог бы и рассказать, как удалось решить задачу. Но вообще здесь надо использовать временную таблицу - примерно так:
CODE (text):
скопировать код в буфер обмена
  1. SELECT a.id_article, a.title, a.id_category, a.rating FROM
  2. (SELECT id_category, MAX(rating) AS max_rating
  3. FROM `articles` WHERE 1 GROUP BY id_category) AS tmp
  4. INNER JOIN `articles` a
  5. ON a.id_category=tmp.id_category
  6. AND a.rating=tmp.max_rating
  7. ORDER BY a.rating DESC

или коррелированный подзапрос
CODE (text):
скопировать код в буфер обмена
  1. SELECT id_article, title, rating, id_category
  2. FROM `articles` a
  3. WHERE rating = (
  4. SELECT MAX( rating )
  5. FROM `articles` b
  6. WHERE a.id_category = b.id_category )
  7. ORDER BY rating DESC

 

Powered by ExBB FM 1.0 RC1