|
|
|
| Что-то совсем мозги перестали работать :(... Помогите, пожалуйста, составить 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. Если что непонятно скажите, а то очень сложно сформулировать проблему. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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
|
так как я в этом мало что понимаю, хотелось бы узнать насколько правильно я сделал с точки зрения оптимизации запроса. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|