2010-07-31 8 views
1

J'ai une table avec une colonne itemID et une colonne categoryID. Les deux colonnes sont les clés primaires parce que chaque élément peut avoir plus de 1 catégorie:SELECT JOIN dans la même table SUR plusieurs lignes

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

Je veux sélectionner des éléments avec les mêmes catégories (en fonction de toutes les catégories d'articles, pas seulement un), alors je dois genre de JOIN la même table.

Je veux être en mesure de trouver des ID d'article avec les mêmes catIDs en fonction d'un ID d'article spécifié.

Note: Par exemple l'article 1 a les catégories 2,3,4,5,6 et l'article 2 ont les catégories 2,3,4,5,6 et l'article 3 ont les catégories 3,5,6 alors si je comparer l'article 1 à l'article 2 et 3 je dois obtenir l'article 2 d'abord, puis l'article 3 parce que l'article 2 ont plus de correspondances de catégories que l'article 3 .. Évidemment, il faut faire avec tous les articles non seulement 3 .. recommander aux visiteurs de produits similaires ...

+1

Veuillez donner un exemple non seulement des données et de la structure de la table, mais aussi du résultat attendu. – VolkerK

+0

@VolkerK: Je ne pense pas que le résultat attendu puisse être dessiné comme une table. Le résultat attendu est d'obtenir des itemsID avec les mêmes catIDs. Donc, je peux faire un SELECT itemIDs qui ont les mêmes catIDs qu'un itemID spécifié. – Jonathan

+4

Si le résultat ne peut pas être dessiné comme une table, alors il n'y a pas de SQL dans le monde qui va le produire. C'est l'un des principes de SQL, c'est que les résultats sont eux-mêmes des tables. Peut-être devriez-vous décomposer votre processus pour pouvoir trouver tous les éléments qui appartiennent à un ensemble particulier de catégories, et l'appeler pour toutes les combinaisons possibles de catégories. – siride

Répondre

1

bâtiment sur requête initiale de Bill, cela devrait lui ordonner dans l'ordre décroissant par le nombre de catégories adaptées (depuis la jointure doit retourner une ligne par match). J'ai également exclu l'élément demandé du résultat.

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; 
+0

Nombre de catégories ne fera pas. Les catégories doivent être les mêmes. – siride

+0

Bien sûr, il ne retournera que des articles avec les mêmes catégories :) Je parlais du nombre de catégories seulement en référence à la commande subséquente. – Nick

+0

On dirait qu'il fait ce que je veux! Merci. @siride: Vous dites seulement comme 'Nombre de catégories ne fera pas' et 'Si le résultat ne peut pas être dessiné comme une table, alors il n'y a pas de SQL'. Juste poster une bonne réponse si vous l'avez. Cela aidera plus ... – Jonathan

0

vous avez plusieurs à plusieurs, de sorte que la requête ressemblera à ceci:

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

Je ne pense pas que c'est correct. Je veux être en mesure de trouver des ID d'article avec les mêmes identificateurs d'identité basés sur un ID d'article spécifié. Basé sur toutes les catégories de l'article, pas seulement dans un. – Jonathan

2

vous voulez choisir un itemId puis matc h à tous les autres itemsID qui partagent un ou plusieurs catID?

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

Quelque chose comme ça, mais ORDONNÉ par les éléments qui ont le plus de correspondances de catégories. Par exemple, l'item 1 a les catégories 2, 3, 4, 5, 6 et l'item 2 a les catégories 2, 3, 4, 5, 6 et l'item 3 les catégories 3, 5, 6 et ensuite je compare l'item 1 aux items 2 et 3 J'ai besoin d'obtenir l'article 2 d'abord, puis l'article 3 parce que l'article 2 a plus de correspondances de catégories que l'article 3 .. Évidemment, il doit être fait avec tous les articles non seulement 3 .. De cette façon, je peux recommander des visiteurs de produits similaires ... – Jonathan

+0

@Jonathan: veuillez modifier ce "petit" amendement dans votre question initiale. – VolkerK

0

Je veux sélectionner des éléments avec les mêmes catégories (en fonction de toutes les catégories d'articles, pas seulement un), alors je dois REJOIGNEZ genre de la même table.

Sans mentionner quoi que ce soit d'autre au sujet de la sortie, vous pouvez faire quelque chose comme:

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 commentaires)

Quelque chose comme ça, mais ORDONNE par des éléments qui ont le plus catégories allumettes. Par exemple, l'item 1 a les catégories 2, 3, 4, 5, 6 et l'item 2 a les catégories 2, 3, 4, 5, 6 et l'item 3 les catégories 3, 5, 6 et ensuite je compare l'item 1 aux items 2 et 3 J'ai besoin d'obtenir l'élément 2 d'abord, puis l'élément 3 parce que l'élément 2 a plus de catégories que l'élément 3

Cela ajoute un aspect différent à la question et c'est pourquoi vous devriez inclure la sortie attendue dans votre message original. Prenant ce que vous avez écrit littéralement:

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 
+0

Eh bien, le deuxième code que vous avez posté est faux. Tout d'abord, C et non C1. Et le deuxième et le plus important j'ai redémarré le serveur après avoir exécuté le code parce que quelque chose d'apache s'est mal passé et tout est allé lentement. Chrome a cessé de fonctionner et Apache est parti. – Jonathan

+0

@Jonathan - Je ne peux pas parler à votre installation cependant, j'ai corrigé les fautes de frappe. Je suppose que la table de catégories a un index à la fois itemId et catId? Group_Concat peut être une opération coûteuse, mais vous n'avez pas non plus mentionné le nombre de lignes impliquées, ni même si vous vouliez réellement une liste concaténée. Nous devinons tous ce que vous cherchez réellement. – Thomas

+0

Eh bien, je pense que si j'ai besoin de comparer tous les éléments de tables est quelque chose comme 6000 + articles .. Que pensez-vous est la meilleure façon de le faire? – Jonathan

Questions connexes