我有一个包含itemID和categoryID列的表。两列都是主键,因为每个项目可以有多个类别:
itemID | catID
-----------------
1 | 2
1 | 3
1 | 4
2 | 2
2 | 3
2 | 4
我想选择具有相同类别的项目(基于所有项目类别,而不仅仅是一个),所以我需要加入同一个表格。
我希望能够根据指定的itemID找到具有相同catID的itemID。
注意:例如,第1项的类别为2,3,4,5,6,第2项的类别为2,3,4,5,6,第3项的类别为3,5, 6然后,如果我将项目1与项目2和3进行比较,我需要首先获得项目2然后项目3,因为项目2比项目3具有更多类别匹配。显然,需要完成所有项目而不仅仅是3 ..这样我就可以推荐类似产品的访客...
答案 0 :(得分:2)
所以你想选择一个itemID,然后将它与共享一个或多个catID的所有其他itemID匹配?
SELECT DISTINCT c2.itemID
FROM categories c1
JOIN categories c2 ON c1.catID = c2.catID
WHERE c1.itemID = ?
答案 1 :(得分:1)
在Bill的初始查询的基础上,这应该按照匹配的类别数的降序排序(因为连接应该每个匹配返回一行)。我还从结果中排除了要查询的项目。
SELECT c2.itemID
FROM categories c1
JOIN categories c2 ON c1.catID = c2.catID
WHERE c1.itemID = :id
AND c2.itemID <> :id
GROUP BY c2.itemID
ORDER BY count(c2.itemID) DESC;
答案 2 :(得分:0)
您有多对多关系,因此查询将如下所示:
SELECT item.name
FROM item AS b
JOIN itemcategories AS ab ON b.ID = ab.itemID
where ab.catID =2;
答案 3 :(得分:0)
我想选择具有相同类别的项目(基于所有项目类别,而不仅仅是一个),所以我需要加入同一个表格。
在不提及输出的任何其他内容的情况下,您可以执行以下操作:
Select C.itemid
From categories As C
Where Exists (
Select 1
From categories As C2
Where C2.catID = C.catID
And C2.itemID <> C.itemID
)
And C.itemID = ?
Group By C.itemid
(来自评论)
类似的东西,但是按类别最多的项目进行排序。例如,项目1具有类别2,3,4,5,6,项目2具有类别2,3,4,5,6,项目3具有类别3,5,6然后如果我将项目1与项目2和3进行比较我需要先获得第2项,然后获得第3项,因为第2项比第3项有更多类别匹配
这会为问题添加不同的肤色,这也是您应该在原始帖子中包含预期输出的原因。从字面上看你所写的:
Select C.itemid, Group_Concat(C.catID Order By C.catID ) As Categories
, Count(*) As MatchCount
From categories As C
Join categories As C2
On C2.itemID <> C.itemID
And C2.catID = C.catID
Group By C.itemID
Order By Count(*) Desc