SELECT JOIN在同一个表中ON多行

时间:2010-07-31 15:34:47

标签: php sql mysql

我有一个包含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 ..这样我就可以推荐类似产品的访客...

4 个答案:

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