SQL Normalform und Abfrageergebnis umformen

Miyamori

Lt. Commander
Registriert
Sep. 2012
Beiträge
1.195
Hallo, dass ich das letzte mal mit SQL (im vorliegendem Fall einen privates Projekt mit mySQL) gemacht hab ist eine Ewigkeit her daher bin ich mir nicht sicher ob ich mein Tabellenstruktur die 3NF erfüllt:

Code:
futtermittel
id 	name 	        preis
1 	Roggenstroh 	0.35
2 	Heu 	        0.15
3 	Wiese 	        0

nährstoffe
id 	name 	einheit
1 	T 	kg
2 	XF 	kg
3 	DP 	g

futtermittel_nährstoffe
fid 	nid 	menge
1 	    1 	    0.86
1 	    2 	    0.47
1 	    3 	    17
2 	    1 	    0.86
2 	    2 	    0.34
2 	    3 	    44
3 	    1 	    0.21
3 	    2 	    0.26
3 	    3 	    86

Desweiten möchte ich mein jetziges Query
Code:
SELECT f.name AS FuMi, n.name AS Nährstoff, fn.Menge
FROM `futtermittel_nährstoffe` fn
JOIN `futtermittel` f ON f.id = fn.fid
JOIN `nährstoffe` n ON n.id = fn.nid
WHERE f.id
IN ( 2, 3 )
welches mir

Code:
FuMi    Nährstoff 	Menge
Heu 	T 	        0.86
Heu 	XF 	        0.34
Heu 	DP 	        44
Wiese 	T 	        0.21
Wiese 	XF 	        0.26
Wiese 	DP 	        86
als Tabelle ausspuckt derart umändern, dass das Ergebnis wie folgt ausschaut:

Code:
Nährstoff   Heu     Wiese
T           0.86    0.21
XF          0.34    0.26
DP          44      86

Wobei die Anzahl der Futtermittel variable ist. Dafür finde ich aber keinen geeigneten Lösungsansatz. Wäre toll wenn mir jemand auf die Sprünge helfen könnte.
 
Dein Ergebnis ist seltsam da du Zeilen und Spalten vertauschst.
Sicher dass es so sein soll? Das umtauschen machst du nicht in SQL, sondern dort wo es dargestellt wird.

In PHP hast nach der Abfrage alles im Array, da kannst dann auch aus deiner obigen Abrage die untere Tabelle erzeugen. In SQL braucht man es nicht so darstellen wie man es am Ende sehen will. Außer du gibst den Kram direkt auf einer Linux shell aus...
 
Zuletzt bearbeitet:
Die dritte Normalform sollte erfüllt sein, wenn ich um die Zeit nicht Tomaten auf den Augen hab.

Das Stichwort für deine zweite Frage ist Pivottabelle. Ich hab das selbst leider auch noch nicht gemacht, weshalb ich dir einfach mal diesen Link vor die Füße werfe http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns
Da du es dynamisch willst wird es etwas komplexer, aber unter dem Link ist das eigentlich alles erklärt, wenn ich das auf die Schnelle richtig überblickt hab. Hoffentlich hilft dir das ein bisschen weiter.
 
Nur eine Teilmenge der Futtermittel, aber ich sehe nicht wie ich mit einem Cross join meine Futtermittel als Spalte bekommen soll.
 
Vergiss das Cross, habs falsch interpretiert.
Wie gesagt, entweder du machst die finale Struktur in PHP oder wo auch immer es ausgegeben wird, oder du fuchtelst mit dem Pivot Kram von oben rum.

Üblicherweise strukturiert man das optische nicht über die Datenbank selbst.
 
du suchst PIVOT

aber frag mich bitte nicht wie die Syntax jetzt genau sein muss, da ich selbst mit dem PIVOT etwas auf Kriegsfuß stehe ;)
 
Der Link Freezedevil war klasse:

Code:
SELECT n.name as Nährstoff, 
 max(case when f.name='Heu' then fn.menge end) Heu,
 max(case when f.name='Wiese' then fn.menge end) Wiese
FROM `futtermittel_nährstoffe` fn
JOIN `futtermittel` f ON f.id = fn.fid
JOIN `nährstoffe` n ON n.id = fn.nid
WHERE f.id IN ( 2, 3 )
GROUP BY n.id

jetzt das ganze noch dynamisch hinbekommen (nachdem schlafen ;))

@Black, ja das mit dem Vertauschen ist der Witz, damit sind T, XD und DP Vektoren die ich gleich weiterreichen kann, ohne das ich mir die aus der ersten Tabelle erst mühsam zusammenbauen muss.
 
Zuletzt bearbeitet:
Zurück
Oben