2011-02-25 3 views
2

J'ai une table (appelée mise en scène) avec les domaines pertinents suivants:MySQL se joindre à une même table

id (PRIMARY) 
bundle_id (INT) 
product (enum H,L,D) 
bundle_code (enum 10,20) 

je dois rechercher un bundle_id où le bundle_code est de 10, puis récupérer également tous les autres dossiers avec le même bundle_id où produit = H et jusqu'à deux enregistrements supplémentaires avec le même bundle_id où produit! = H. J'essaye de faire cela en une seule requête, en retournant une ligne par bundle_id; J'ai donc une liste de bundle_ids, chacun contenant chaque produit et identifiant attaché à bundle_id.

Le meilleur que je suis venu avec c'est:

SELECT e1.bundle_id AS b_id, e1.product AS prod, e1.id AS id, 
e2.bundle_id AS b2_id, e2.product AS prod2, e2.id AS id2, 
e3.bundle_id AS b3_id, e3.product AS prod3, e3.id AS id3, 
e4.bundle_id AS b4_id, e4.product AS prod4, e4.id AS id4,  
FROM `staging` AS e1 
INNER JOIN `staging` AS e2 ON (e1.bundle_id = e2.bundle_id AND e1.id != e2.id) 
INNER JOIN `staging` AS e3 ON (e2.bundle_id = e3.bundle_id AND e2.id != e3.id) 
INNER JOIN `staging` AS e4 ON (e1.bundle_id = e4.bundle_id AND e3.id != e4.id) 
WHERE e1.bundle_code = '10' 
AND e2.bundle_code = '20' 
AND e2.product = 'H' 
AND e3.product != 'H' 
AND e4.product != 'H' 

Cela semble fonctionner très bien s'il y a quatre résultats totaux, mais s'il y a trois résultats alors un ensemble de données est un double (en ce cas, il est id 1691):

b_id prod id  b2_id prod2 id2  b3_id prod3 id3  b4_id prod4 id4 
208768 NULL 1691 208768 H  1692 208768 NULL 1691 208768 L  1693 

Si j'ajoute en plus des clauses WHERE pour essayer d'empêcher cela, il ne renvoie aucune ligne à la place, donc je pense ma syntaxe JOIN est hors quelque part. Des idées?

+0

l'entrée de base sera-t-elle toujours nulle? aussi vous montrez H, L, D pour les entrées. Seront-ils uniques pour chacun? – rayman86

+0

Le produit est toujours NULL où bundle_code = 10, et toujours non NULL où bundle_code = 20. Il ne devrait y avoir qu'un seul H par bundle_code, et un ou deux L par bundle_code. Le dernier bit est ce qui me donne le problème. –

Répondre

4
SELECT e1.bundle_id AS b_id, e1.product AS prod, e1.id AS id, 
e2.bundle_id AS b2_id, e2.product AS prod2, e2.id AS id2, 
e3.bundle_id AS b3_id, e3.product AS prod3, e3.id AS id3, 
e4.bundle_id AS b4_id, e4.product AS prod4, e4.id AS id4,  
FROM `staging` AS e1 
INNER JOIN `staging` AS e2 ON (e1.bundle_id = e2.bundle_id AND e1.id != e2.id) 
LEFT JOIN `staging` AS e3 ON (e1.bundle_id = e3.bundle_id AND e2.id != e3.id AND e3.id != e1.id AND e3.product != 'H') 
LEFT JOIN `staging` AS e4 ON (e1.bundle_id = e4.bundle_id AND e3.id != e4.id AND e4.id != e2.id AND e4.id != e1.id AND e4.product != 'H') 
WHERE e1.bundle_code = '10' 
AND e2.bundle_code = '20' 
AND e2.product = 'H'; 
+0

Ce n'est pas le cas - renvoie zéro résultat. Comme je l'ai mentionné, j'ai essayé deux ou trois choses similaires et ça ne rapporte rien. –

+0

GOt it .. supprimer les WHERE et les mettre dans le JOIN pour les tables respectives dans la requête ci-dessus et il devrait fonctionner pour vous. – amitchd

+0

Voulez-vous dire: 'INNER JOIN mise en scène AS e2 ON (e1.bundle_id = e2.bundle_id ET e1.bundle_code = '10')'? –