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?
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
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. –