MYSQL Mehrere Ergebnisse als Spalte ausgeben

Tleifight

Grünschnabel
Hallo,


ich habe eine Frage zu Unterabfragen bei Mysql. Ich habe eine Log Datei, die die Spalten Datum, Uhrzeit, Wert, ... und Name enthält. Ich möchte jetzt eine Abfrage ausführen, in der ich eine Tabelle bekomme, die die Spalten mit den gesuchten Namen und der dazugehörigen Werten erhält.
Beispiel: Ich Suche nach Name1, Name2 und Name3, diese soll in der Select Abfrage in Spaltenform aufgebaut werden.

Der Aufbau der ausgebenen Tabelle sollte dann so aussehen:

Datum Uhrzeit Name1 Name2 Name3
XX-XX-XXX XX-XX-XX Wert Wert Wert

Schonmal Danke für die Hilfe :)
 
MySQL kennt leider keine Pivot oder Cross-Funktionen. Das heisst, du musst das selber von Hand ausprogrammieren. In deinem Fall ist es aber nicht empfehlenswert weil du jedes mal andere Spalten hast.
SQL:
SELECT
	t.datum,
	t.uhrzeit,
	MAX(IF(t.`name` == 'Name1', wert, null)) AS name1,
	MAX(IF(t.`name` == 'Name2', wert, null)) AS name2,
	MAX(IF(t.`name` == 'Name3', wert, null)) AS name3
FROM 
	my_table AS t
GROUP BY
	t.datum,
	t.uhrzeit;

Du solltest also so ein Querystring in PHP (oder mit was du auch immer arbeitest) zusammensetzen
 
Zuletzt bearbeitet von einem Moderator:
Ich hatte es einmal soweit, das der Aufbau generell funktionierte. Leider hatte ich das Problem, das die Werte mehr mals in den einzelnen Zeilen auftauchten . So wurde aus einer Tabelle mit 219000Einträge, eine Tabelle mit mehreren Millionen.
Ist es auch möglich drei Abfragen zu starten und die Ergebnisse in einzelnen Spalten aneinander zu hängen?
 
Das was du beschreibst kann mit meiner SQL-Vorlage nicht passieren. Es ist so unmöglich mehr Einträge zu haben.

Zeig mal dein Versuch.



Ja, es ist auch möglich das mit mehreren Abfragen zu lösen. Es wird aber komplizierter und die Gefahr dass da passiert was dir passiert ist ist grösser.
SQL:
SELECT
	t1.datum,
	t1.uhrzeit,
	t1.name1,
	t2.name2,
	t3.name3
FROM
	(SELECT t.datum, t.uhrzeit, t.`name`, t.value AS name1 FROM my_table WHERE t.`name` = 'Name1') AS t1
	(SELECT t.datum, t.uhrzeit, t.`name`, t.value AS name2 FROM my_table WHERE t.`name` = 'Name2') AS t2
	(SELECT t.datum, t.uhrzeit, t.`name`, t.value AS name3 FROM my_table WHERE t.`name` = 'Name3') AS t3
WHERE
	t1.datum = t2.datum
	AND t1.uhrzeit = t2.uhrzeit
	AND t1.datum = t3.datum
	AND t1.uhrzeit = t3.uhrzeit
Dies unter der Annahme, dass zu jedem Name1 ein Name2 und ein Name3 existieren. Wenn dem nicht so ist, wirds lustig. Mit einfachen LEFT JOIN gehts dann nicht mehr, da auch auch Name1 NULL sein könnte.

Mit UNION kommt man fast auf das was ich als erstes hatte. Ist aber auch komplizierter
SQL:
SELECT
    t.datum,
    t.uhrzeit,
    MAX(name1) AS name1,
    MAX(name2) AS name2,
    MAX(name3) AS name3
FROM
	(
		SELECT t.datum, t.uhrzeit, t.`name`, t.value AS name1, NULL AS name2, NULL AS name3 FROM my_table WHERE t.`name` = 'Name1'
		UNION ALL SELECT t.datum, t.uhrzeit, t.`name`, NULL AS name1, t.value AS name2, NULL AS name3 FROM my_table WHERE t.`name` = 'Name2'
		UNION ALL SELECT t.datum, t.uhrzeit, t.`name`, NULL AS name1, NULL AS name2, t.value AS name3 FROM my_table WHERE t.`name` = 'Name3'
	) AS t
GROUP BY
    t.datum,
    t.uhrzeit;

Meine Ursprüngliche Variante ist die sauberste und verhindert dein Problem mit der Multiplikation der Daten.
 
Zuletzt bearbeitet von einem Moderator:
Den Versuch hatte ich in einem Blog gefunden. Dummerweise finde ich ihn nicht mehr.

Der Aufbau Bestand aus einer Hauptselect Anweisung(Select * FROM), wo in der From Klausel weitere Select Anweisungen standen. Die Unterabfragen waren mit LEFT JOIN's verbunden.

Ja, ich programmiere mit php.
 
Zuletzt bearbeitet:
Die erste Version läuft bei mir nur, wenn ich Join's zwischen den Unterselects setze. Und selbst dann hab ich wieder alles mehrfach...
Ich werde das wohl mit mehreren Abfragen machen und die entstandenen Arrays zusammensetzen.
 
Die erste Version hat keine Joins. Darum kann sie sich auch nicht vervielfachen

SQL:
SELECT
	t.datum,
	t.uhrzeit,
	MAX(IF(t.`name` == 'Name1', wert, null)) AS name1,
	MAX(IF(t.`name` == 'Name2', wert, null)) AS name2,
	MAX(IF(t.`name` == 'Name3', wert, null)) AS name3
FROM 
	my_table AS t
GROUP BY
	t.datum,
	t.uhrzeit;

Alle weiteren Versionen waren nur um die zu zeigen dass alles Anderes Komplizierter und Fehlerfreundlicher ist nachdem du dich über diese Version 'beklagt' hast.

Langsam glaube ich, du hast diese nie getestet....
 
Zuletzt bearbeitet von einem Moderator:
Ich probiere grad mehrere Varianten aus, aber zu deinem Beispiel bekomme ich kein Ergebnis angezeigt.

Die If Bedingung sucht doch nach dem "Name1" in der Tabelle t im "name"?
 
Ja. Oder wie das Feld auch immer heisst.
Aber ich hab da noch ein Fehler drin == must du durch = ersetzen....
 
Zurück