SELECCIONAR JUNTA en la misma tabla EN múltiples filas

Tengo una tabla con un itemID y un categoryID columnas. Ambas columnas son keys principales porque cada elemento puede tener más de 1 categoría:

itemID | catID ----------------- 1 | 2 1 | 3 1 | 4 2 | 2 2 | 3 2 | 4 

Quiero seleccionar elementos con las mismas categorías (basados ​​en todas las categorías de elementos, no solo uno), así que necesito unirme a la misma tabla.

Quiero poder encontrar ID de elemento con los mismos catID basados ​​en un ID de elemento especificado.

Nota: Por ejemplo, el ítem 1 tiene las categorías 2,3,4,5,6 y el ítem 2 tiene las categorías 2,3,4,5,6 y el ítem 3 tiene las categorías 3,5,6, entonces si yo comparo el ítem 1 con el ítem 2 y 3 necesito get primero el artículo 2 y luego el artículo 3 porque el artículo 2 tiene más categorías que el elemento 3. Obviamente, debe hacerse con todos los artículos, no solo con 3 … De esta forma puedo recomendar visitas de productos similares. ..

Sobre la base de la consulta inicial de Bill, esto debe orderarse en order descendente por el número de categorías coincidentes (ya que la unión debe devolver una fila por coincidencia). También excluí el elemento que se consulta desde el resultado.

 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; 

Entonces, ¿desea elegir un ID de elemento, luego hacer coincidirlo con todos los demás ID de elemento que comparten uno o más catID?

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

Tiene una relación de muchos a muchos, por lo que la consulta se verá así:

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

Quiero seleccionar elementos con las mismas categorías (basados ​​en todas las categorías de elementos, no solo uno), así que necesito unirme a la misma tabla.

Sin mencionar nada más sobre la salida, puede hacer algo como:

 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 

(De los comentarios)

Algo así, pero ORDENADO por los elementos que tienen la mayor cantidad de categorías coinciden. Por ejemplo, el ítem 1 tiene las categorías 2,3,4,5,6 y el ítem 2 tiene las categorías 2,3,4,5,6 y el ítem 3 tiene las categorías 3,5,6, entonces si yo comparo el ítem 1 con el ítem 2 y 3 Necesito get primero el artículo 2 y luego el artículo 3 porque el artículo 2 tiene más categorías que el elemento 3

Esto agrega una complexión diferente a la pregunta y es por eso que debe include el resultado esperado en su publicación original. Tomando lo que has escrito literalmente:

 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