查找最佳类别匹配的 SQL 查询

Posted

技术标签:

【中文标题】查找最佳类别匹配的 SQL 查询【英文标题】:SQL query finding best categories match 【发布时间】:2011-12-06 16:12:51 【问题描述】:

我的项目有类别和多个分类。 如何为特定项目查找具有相同类别的其他项目,按大多数类别匹配(也称为最佳匹配)排序?

我的表结构大致是:

项目表

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`

【问题讨论】:

那么你的问题是什么?你试过什么?为什么这不起作用? 谢谢,改写和标记。 【参考方案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 实例来试用它。

【讨论】:

它完全符合我的需要,添加到 WHERE 子句 i1.id = ,因为我想为特定项目找到最匹配的项目。谢谢【参考方案2】:

类似:

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

【讨论】:

【参考方案3】:

我刚刚实施的解决此问题的另一种方法是使用按位运算符来加快速度。在 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 特定的,因此任何其他 DB 都可能需要替代方法。

这里解释了使用的 MySQL 位函数: http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html

【讨论】:

以上是关于查找最佳类别匹配的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 查询类别中的产品(数据库设置和最佳实践)

SQL 查询查找专属客户

Firebird(如何使用 SQL 查找父类别)

SQL查询,用于在一周中的每一天为项目排序的EACH类别中查找UNITS

使用 STL 在相反类别中查找具有匹配属性的元素的算法

在数组中查找匹配项