Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Просуммировать значения одного поля с группировкой по другому
 
 автор: Ziq   (13.08.2007 в 13:17)   письмо автору
 
 

Что-то совсем мозги перестали работать :(... Помогите, пожалуйста, составить SQL-запрос. Задача такая:

Существует таблица вот с такими данными

id_page | id_word | relevance
1       | 1       | 0.02
1       | 23      | 0.05
1       | 3       | 0.12
...
11      | 2       | 0.02
11      | 23      | 0.07
11      | 3       | 0.10

необходимо просуммировать relevance для каждой id_page по заданным id_word и отсортировать по получившемуся значению

т.е. если человек решит поискать слова с id_word равными 1 и 3, то в выдаче сначала должна появиться id_page = 1 (0.02 + 0.12 = 0.14), а потом с id_page = 11 (0.10)

Заранее ОГРОМНОЕ спасибо.

P.S. Если что непонятно скажите, а то очень сложно сформулировать проблему.

   
 
 автор: Trianon   (13.08.2007 в 13:34)   письмо автору
 
   для: Ziq   (13.08.2007 в 13:17)
 


SELECT tbl.id_page, rt.rel
 FROM tbl
 LEFT JOIN
   (SELECT id_page, SUM(relevance) AS rel
    FROM tbl
    WHERE id_word IN ($wordlist)
    GROUP BY id_page
    ) AS rt ON tbl.id_page = rt.id_page
 WHERE tbl.id_word IN ($wordlist)
 ORDER BY rt.rel DESC

   
 
 автор: Ziq   (13.08.2007 в 14:08)   письмо автору
 
   для: Trianon   (13.08.2007 в 13:34)
 

Огромное человеческое спасибо, действительно помогли.

Возник еще небольшой вопрос. Если использовать приведенный вами пример, то происходит повторение страниц при использовании нескольких слов для поиска. Я решил немного модифицировать код вот таким образом

SELECT tbl.id_page, rt.rel 
 FROM tbl 
 LEFT JOIN 
   (SELECT id_page, SUM(relevance) AS rel 
    FROM tbl 
    WHERE id_word IN ($wordlist) 
    GROUP BY id_page 
    ) AS rt ON tbl.id_page = rt.id_page 
 WHERE tbl.id_word IN ($wordlist) 
 GROUP BY tbl.id_page
 ORDER BY rt.rel DESC

так как я в этом мало что понимаю, хотелось бы узнать насколько правильно я сделал с точки зрения оптимизации запроса.

   
 
 автор: Trianon   (13.08.2007 в 14:27)   письмо автору
 
   для: Ziq   (13.08.2007 в 14:08)
 

Вы допустили ошибку. Группирующий запрос применим только к агрегатным SELECT-полям.
Если Вас интересовал не список страниц с любыми ответами, а страница с максимальной релевантностью - так и следовало написать:

SELECT tbl.id_page, MAX(rt.rel)  AS mrel
 FROM tbl  
 LEFT JOIN  
   (SELECT id_page, SUM(relevance) AS rel  
    FROM tbl  
    WHERE id_word IN ($wordlist)  
    GROUP BY id_page  
    ) AS rt ON tbl.id_page = rt.id_page  
 WHERE tbl.id_word IN ($wordlist)  
 GROUP BY tbl.id_page 
 ORDER BY mrel DESC

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования