"gekippte" Ausgabe von Werten
Problembeschreibung
Jetzt hat man sich die Mühe gemacht und sein Datenmodell (halbwegs) normalisiert
und dann kann man seine Werte nicht mehr nebeneinander schreiben?
Statt dem
select e.name,w.inhalt,i.wert
mit dem Ergebnis
from element e,
information i,
wert w
where e.id=i.element_id
and w.id=i.wert_id
Name | Information | Wert |
---|---|---|
Georg | Geburtstag | 23.07. |
Georg | Kreis | WES |
Ursula | Kreis | DN |
Anna | Geburstag | 05.03. |
Name | Geburtstag | Kreis |
---|---|---|
Georg | 23.07. | WES |
Ursula | DN | |
Anna | 05.03. |
Lösungsansatz
Es gibt zwei Strategien dieses Problem zu lösen.
Variante 1
Variante 1 erzeugt erste eine temporäre Tabelle, in dem die einzelnen Werte in die "richtige" Spalte selektiert werden und gruppiert dann über den Namen den maximalen Wert der Informationen.
SELECT name, max(wert1) as "Geburtstag", max(wert2) as "Kreis"
FROM (
SELECT a.name as name, b.wert as wert1, '' as wert2
FROM element a, information b
WHERE b.Element_id=a.id
AND b.wert_id=1
UNION
SELECT a.name, '', b.wert
FROM element a, information b
WHERE b.Element_id=a.id
AND b.wert_id=2
) c
GROUP BY name
;
Variante 2
Variante 2 macht einen direkten LEFT-Join für alle gewünschten wert_id
-Ausprägungen jeweils über die Tabellen information und wert.
Bei vielen wert_id-Auspägungen kann die Datenbank dabei schonmal ins Schwitzen
geraten.
SELECT a.name as name, b.wert as "Geburtstag", c.wert as "Kreis"
FROM element a
LEFT JOIN information b
ON (b.Element_id = a.id AND b.wert_id=1)
LEFT JOIN information c
ON (c.Element_id = a.id AND c.wert_id=2)
;
Hinweis
In beiden Varianten sollte auf jeden Fall sichergestellt sein, dass pro
wert_id und element_id nur ein Wert existiert.
ALTER TABLE information
ADD PRIMARY KEY (element_id,wert_id)
;
Für eine dynamische Variante mit einer beliebigen (genauer nicht festen) Anzahl von wert_id-Ausprägungen würde ich persönlich ein PHP-Script (z.B.) bevorzugen, dass das SQL-Statement der Variante 1 erzeugt und die auch die entsprechende HTML-Tabelle erzeugt.
Kommentare und Anregungen werden gerne angenommen.