Zeig her deine Kinder oder wie man bei 1:N Verknüpfungen gleiche Elemente findet

Mal wieder ein echter SQL Klassiker:
Also, ich habe drei Tabellen:

Tabelle: childType
id integer
name varchar

Primary-Key: id

Tabelle: parent
id integer

Primary-Key: id

Tabelle: children
parentId integer
childTypeId integer
content varchar

Primary-Key: id, childTypeId

Ich habe also eine grosse Maske, in der ich den parent und alle children eines parent pflegen kann. Ich will jetzt also beim Speichern rausbekommen, ob es einen weiteren parent in der Datenbank gibt, bei dem der namen aller children gleich ist. Ja, man kann das über ein group_concat näherungsweise lösen, problematisch wird es jedoch, wenn einige childrenType gesetzt sind und andere nicht. Ausserdem greift da der Index nicht so toll. Also, bleibt wohl nur ein Monster-Left-Join. Nehmen wir an, es gibt 6 unterschiedliche childType und wir haben in der Maske den ersten nicht gepflegt und in 2 – 6 jeweiel den text childTypeContentText[n] geschrieben.

SELECT * FROM parent
LEFT JOIN children AS child01 ON parent.id = child01.parentId AND child01.childTypeId = 1
LEFT JOIN children AS child02 ON parent.id = child02.parentId AND child02.childTypeId = 2
LEFT JOIN children AS child03 ON parent.id = child03.parentId AND child03.childTypeId = 3
LEFT JOIN children AS child04 ON parent.id = child04.parentId AND child04.childTypeId = 4
LEFT JOIN children AS child05 ON parent.id = child05.parentId AND child05.childTypeId = 5
LEFT JOIN children AS child06 ON parent.id = child06.parentId AND child06.childTypeId = 6
WHERE
child01.name IS NULL
AND
child02.name = 'childTypeContentText02'
AND
child03.name = 'childTypeContentText03'
AND
child04.name = 'childTypeContentText04'
AND
child05.name = 'childTypeContentText05'
AND
child06.name = 'childTypeContentText06'

So, ich hoffe das ist soweit klar und hilft evtl. dem ein oder anderen…
Ohne feste childTypes, also mit beliebig vielen children wird das dann wohl doch nur über ein Subselect lösbar oder hat auch hier jemand ne schöne Lösungsmöglichkeit?

GD Star Rating
loading...

Kommentar verfassen