2017-02-05 7 views
-1

Sorry, ich bin mir sicher, dass dies eine doppelte Frage ist, aber ich weiß nicht, wie ich über mein Problem suchen kann. Ich möchte zwei Tabellen (wie Wordpress Post und Post_metas) zu einer dritten Matrix verbinden.Verbinden Sie zwei Tabellen und Pivot

Ich bin mit MySQL + PHP

UPDATE: Dank für die erste Lösung, ich bin für die beste Lösung suchen. Wenn nicht empfohlen, mysql zu verwenden, können Sie mir eine andere Lösung für PHP empfehlen.

Ich brauche die reibungslosere Lösung. Vielleicht können Sie mir helfen, es zu finden :) Danke Jungs!

FOODS

+----+-----------+ 
| id | Food name | 
+----+-----------+ 
| 1 | Apple  | 
| 2 | Banana | 
| 3 | Milk  | 
+----+-----------+ 

nutritions

+----+---------+-----------+-------+ 
| id | food_id | name | value | 
+----+---------+-----------+-------+ 
| 1 |  1 | energy | 1 | 
| 2 |  1 | glucose | 11 | 
| 3 |  1 | fructose | 4 | 
| 4 |  2 | energy | 36 | 
| 5 |  2 | glucose | 112 | 
| 6 |  2 | b-vitamin | 67 | 
| 7 |  2 | sucrose | 3 | 
| 8 |  3 | fat  | 6 | 
| 9 |  3 | calcium | 66 | 
| 10 |  3 | energy | 77 | 
+----+---------+-----------+-------+ 

ich so etwas wie dies möchte:

+--------+--------+---------+----------+-----------+---------+-----+---------+ 
| Food | energy | glucose | fructose | b-vitamin | sucrose | fat | calcium | 
+--------+--------+---------+----------+-----------+---------+-----+---------+ 
| Apple |  1 |  11 |  4 |   0 |  0 | 0 |  0 | 
| Banana |  36 |  112 |  0 |  67 |  3 | 0 |  0 | 
| Milk |  77 |  0 |  0 |   0 |  0 | 6 |  66 | 
+--------+--------+---------+----------+-----------+---------+-----+---------+ 
+4

Welches DBMS benutzen Sie? Dies wird auch als Pivoting bezeichnet und sollte in Ihrem Anwendungscode erfolgen. – GurV

+0

Warum brauchen Sie diese dritte Matrix? – abl

+0

Ich muss eine dritte Tabelle basierend auf den ersten beiden Tabellen drucken. – Peter

Antwort

0

folgende Abfrage funktioniert:

select f.foodname, 
     max(case when n.name='energy' then value else 0 end)energy, 
     max(case when n.name='glucose' then value else 0 end)glucose, 
     max(case when n.name='fructose' then value else 0 end)fructose, 
     max(case when n.name='b-vitamin' then value else 0 end)b_vitamin, 
     max(case when n.name='sucrose ' then value else 0 end)sucrose , 
     max(case when n.name='fat ' then value else 0 end)fat , 
     max(case when n.name='calcium ' then value else 0 end)calcium 
from foods f, 
    nutritions n 
where f.id=n.food_id  
group by f.foodname 
+0

Hm was, wenn ich 1000 verschiedene Ernährung habe? Das wird langsam sein, denke ich. – Peter

+0

Auf Ihren Kommentar zu Bhavesh: SQL ist über eine feste Anzahl von Spalten. Einige Datenbanken bieten in ihrem SQL eine PIVOT-Funktionalität, aber wie bereits gesagt, ist eine variable Anzahl von Spalten gegen die Prinzipien der relationalen Algebra. Du bist also mit Bhaveshs Antwort festgefahren, fürchte ich ... – marcothesane

+0

Ja, ich sagte auf einem anderen Kommentar: Das sind meine Arbeitgeber Anforderungen. Ich könnte Datenbank und Webapp so viel besser entwerfen, aber mein Arbeitgeber möchte den Benutzern zu viel Freiheit bieten .. ich sollte gegen Standardgrundsätze in diesem Projekt gehen ... Er kümmert sich nicht um Langsamkeit und Sicherheit (er bat mich, Feld zu sperren Validierung: DD) .. also habe ich mich selbst in den Slave-Modus :)) – Peter

Verwandte Themen