Ограничения на функцию SUM в запросе MySQL - PullRequest
0 голосов
/ 14 июня 2011

Я работаю над созданием базовой поисковой системы в MySQL. поиск основан на ключевых словах, и каждый элемент поиска имеет ряд ключевых слов, связанных с ним. Каждое ключевое слово имеет вес, связанный с ним, чтобы определить, насколько «важно» ключевое слово для элемента. Таблицы выглядят так:

== table: keyword_item ==      
column: item_id (int)
column: keyword (varchar)
column: weight (float)

== table: item ==
column: id (int)
column: title (varchar)
column: url (varchar)

Что я хочу сделать, это отфильтровать элементы, у которых достаточно большая сумма весов, и я попробовал следующий запрос:

SELECT item_id, title, url, sum(weight) as w FROM keyword_item INNER JOIN item ON (w > 3 AND (keyword = 'key1' OR keyword = 'key2' OR keyword = 'key3' ) AND item_id = id) GROUP BY item_id ORDER BY w DESC

Но это дает мне ошибку:

#1054 - Unknown column 'w' in 'on clause'

Я также попытался изменить "w> 3" в предложении ON на "sum (weight)> 3", но тогда я получаю ошибку:

#1111 - Invalid use of group function

Теперь, я не очень много знаю о MySQL, и я уверен, что есть совершенно хорошее объяснение, почему это не работает, но я хотел бы знать, есть ли способ достичь того, что я хочу.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

Я бы использовал предложения WHERE и HAVING вместо того, чтобы помещать все в ON.

SELECT item_id, title, url, sum(weight) as w
FROM keyword_item INNER JOIN item ON item_id = id
WHERE (keyword = 'key1' OR keyword = 'key2' OR keyword = 'key3')
GROUP BY item_id
HAVING w > 3
ORDER BY w DESC
0 голосов
/ 14 июня 2011

Попробуйте использовать HAVING:

SELECT item_id, title, url, sum(weight) as w 
FROM keyword_item 
INNER JOIN item ON item_id = id
WHERE  keyword in ('key1', 'key2', 'key3' )
GROUP BY item_id, title, url
HAVING sum(weight) > 3 
ORDER BY w DESC
...