2011-12-06 40 views
0

我對我的項目有類別和多個分類。 如何查找特定商品中具有相同商品類別的其他商品,並按大部分商品類別匹配(即最佳匹配)排序?查詢最佳類別匹配的SQL查詢

我的表結構大致是:

項目表

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` 
+2

那麼,什麼是你的問題?你有什麼嘗試?爲什麼這不起作用? –

+0

謝謝你的改寫和標記。 – guiding5

回答

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實例來試用它。

+0

它正是我所需要的,添加到WHERE子句i1.id = ,因爲我想爲特定項目找到最匹配的項目。謝謝 – guiding5

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 
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