关于php:SELECT JOIN在同一个表中ON多行

SELECT JOIN in same table ON multiple rows

我有一个带有itemID和categoryID列的表。这两列都是主键,因为每个项可以有一个以上的类别:

1
2
3
4
5
6
7
8
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个。这样我就可以推荐类似产品的访问者…


所以您想选择一个itemID,然后将其与共享一个或多个catid的所有其他itemID匹配?

1
2
3
4
SELECT DISTINCT c2.itemID
FROM categories c1
JOIN categories c2 ON c1.catID = c2.catID
WHERE c1.itemID = ?


基于Bill的初始查询,应该按照匹配的类别数降序排列它(因为联接应该每个匹配返回一行)。我也从结果中排除了正在查询的项目。

1
2
3
4
5
6
7
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;


I want to select items with the same categories (based on all the item categories, not just one) so I need to kind of JOIN the same table.

在不提及输出的任何其他内容的情况下,您可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
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

(来自评论)

Something like that, but ORDERED by items that have the most categories matches. For example item 1 have categories 2,3,4,5,6 and item 2 have categories 2,3,4,5,6 and item 3 have categories 3,5,6 then if i compare item 1 to item 2 and 3 i need to get item 2 first and then item 3 because item 2 have more categories matches than item 3

这就给这个问题增加了不同的肤色,这就是为什么你应该在原来的文章中包含预期的输出。从字面上看你所写的:

1
2
3
4
5
6
7
8
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


您有多对多关系,因此查询如下:

1
2
3
4
SELECT item.name
  FROM item AS b
   JOIN itemcategories AS ab ON b.ID = ab.itemID
 where ab.catID =2;