0

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'

また、ON 句の「w > 3」を「sum(weight) > 3」に変更しようとしましたが、エラーが発生します。

#1111 - Invalid use of group function

さて、私は MySQL についてよく知りません。これがうまくいかない理由については完全に適切な説明があると確信していますが、私が望むことを達成する方法があるかどうか知りたいです。

ありがとう!

4

2 に答える 2

0

使用してみてください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
于 2011-06-14T17:32:40.470 に答える
0

WHEREにすべてを入れる代わりにandHAVING句を使用し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
于 2011-06-14T17:38:16.657 に答える