![](/img/trans.png)
[英]How to join multiple rows from same table and select only the column with not NULL values + add an alias to the column
[英]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.