簡體   English   中英

在多行同一表中選擇聯接

[英]SELECT JOIN in same table ON multiple rows

我有一個帶有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.項都需要完成所有項的匹配。這樣,我可以推薦類似產品的訪客。 ..

因此,您想選擇一個itemID,然后將其與共享一個或多個catID的所有其他itemID相匹配?

SELECT DISTINCT c2.itemID
FROM categories c1
JOIN categories c2 ON c1.catID = c2.catID
WHERE c1.itemID = ?

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

您具有多對多關系,因此查詢將如下所示:

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

我想選擇具有相同類別的項目(基於所有項目類別,而不僅僅是一個類別),因此我需要加入同一張表。

在不提及輸出的任何其他內容的情況下,您可以執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM