我的项目有类别和多个分类。 如何查找特定项目,其他具有相同类别的项目,按大多数类别匹配排序(也称为最佳匹配)?
我的表结构大致是:
项目表
ID
Name
...
类别表
ID
Name
...
分类表
ID
Item_ID
Category_ID
...
要查找具有相似类别的所有项目,例如,我使用
SELECT `items`.*
FROM `items`
INNER JOIN `categorizations` c1
ON c1.`item_id` = `items`.`id`
INNER JOIN `categorizations` c2
ON c2.`item_id` = <Item_ID>
WHERE `c1.`category_id` = c2.`category_id`
答案 0 :(得分:1)
这应该产生一个表,其中包含至少共享一个类别的每对项目之间的类别匹配计数。
select i1.item_id,i2.item_id,count(1)
from items i1
join categorizations c1 on c1.item_id=i1.item_id
join categorizations c2 on c2.category_id=c1.category_id
join items i2 on c2.item_id=i2.item_id
where i1.item_id <> i2.item_id
group by i1.item_id,i2.item_id
order by count(1)
我怀疑它可能有点慢。我目前没有MySQL的实例来试用它。
答案 1 :(得分:0)
类似的东西:
select item_id, count(id)
from item_category ic
where exists(
select category_id
from item_category ic2
where ic2.item_id = @item_id
and ic2.category_id = ic.category_id )
where item_id <> @item_id
group by item_id
order by count(item_id) desc
答案 2 :(得分:0)
我刚刚实现的另一种解决此问题的方法是使用按位运算符来加快速度。在MySQL中,只有64位或更少的类别才能使用此方法,因为位函数是64位。
1)为每个类别分配一个唯一的整数值,该值是2的幂。
2)对于每个项目,对项目所在的类别值进行求和,以创建一个64位int,表示该项目所在的所有类别。
3)将项目与另一项目进行比较时,请执行以下操作:
SELECT id, BIT_COUNT(item1categories & item2categories) AS numMatchedCats FROM tablename HAVING numMatchedCats > 0 ORDER BY numMatchedCats DESC
BIT_COUNT()函数可能是MySQL特定的,因此任何其他数据库都可能需要替代。
使用的MySQL位函数在这里解释: http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html