mySQL Befehl um zwei Datenfelder in einer Antwort auszugeben?

Hallo SQL Experten!

Ich habe in einer Datenbank mehrere Tabelleneinträge mit einem gleichen „index“ und verschiedenen Inhalten in einer weiteren Spalte. Nun möchte ich diese Inhalte nach diesem „index“ gesammelt ausgeben; in einer einzigen Antwort!

Also versuch einens Beispiels:
Tabelle „tabelle“
Mit Spalten: „index“, „text“
Sieht z.B. so aus:

1 | Hallo
1 | Welt
2 | Wie
2 | Gehts
3 | …

Nun möchte ich nur die Texte zu Index „2“ ausgeben.
Mit nem simplen WHERE kann ich das natürlich auswählen, aber ich bekomme ja dann ein
2 | Wie
2 | Gehts
zurück.
Mein Ziel ist aber als Ergebnis:
2 | Wie | Gehts

Oder „Alternativ“, weil ich beim herumgegoogel kurz über was gestolpert bin aber nicht nachvollziehen konnte gerne auch etwas wie:
2 | Wie, Gehts

Ist sowas möglich? Und wenn ja, wie? Vermutlich irgendwas einfaches und ich steh voll auf dem Schlauch, aber ich kenn mich halt mit SQL nicht so aus…

Würde mich freuen, wenn mir wer den Tipp in die richtige Richtung geben könnte!
Danke!

grüßle

Ich will gar nicht wissen, warum du das so machst. Das ist an so vielen Stellen falsch…

Hast du schonmal was von Subqueries gehört? Die könnten gehen, wenn du noch eine Sortierspalte einfügen würdest. Du brauchst halt was, um jede einzelne Zeile eindeutig zu indentifizieren.

+-------+------+-------+
| index | sort | text  |
+-------+------+-------+
|     1 |    1 | Hallo |
|     1 |    2 | Welt  |
|     2 |    1 | Wie   |
|     2 |    2 | Gehts |
+-------+------+-------+

Die Abfrage wäre dann

 SELECT DISTINCT index, 
  (SELECT text FROM table AS subTable WHERE subTable.index = outerTable.index AND sort=1) AS text1,
  (SELECT text FROM table AS subTable WHERE subTable.index = outerTable.index AND sort=2) AS text2
FROM table AS outerTable

Das Ergebnis wäre dann

+-------+-------+-------+
| index | text1 | text2 |
+-------+-------+-------+
|     1 | Hallo | Welt  |
|     2 | Wie   | Gehts |
+-------+-------+-------+

Aber nochmal, das Datenbankmodell ist Mist. Das ist performanceseitig Mist. Das skaliert nicht. Das Pferd ist tot, steige bitte ab und denke neu.

Das geht auch mit Subqueries ohne Anpassung deiner Tabellenstruktur.

SELECT DISTINCT index, 
    (SELECT GROUP_CONCAT(text SEPARATOR ',') FROM table AS subTable WHERE subTable.index = outerTable.index) AS text
FROM table AS outerTable

https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat

Also die „Geschichte“ ist so:
Ein Freund hat auf seiner Webseite einen Shop, den er halt von seinem Anbieter mitgekauft hat und man halt einfach „zusammenklicken“ kann. Und für ein Event, wo er nun Tickets verkauft hat, wollte er eine Gästeliste erstellen (Tickets kann man an der Abendkasse hinterlegen nach Zahlung).
Und diese Bestellung ist über drei(!) Tabellen aufgeteilt und ja, gerade der Name/Adresse ist genauso aufgebaut wie in deiner „Sortierspalte“. Sieht etwa so aus:

+-----------+-----------+--------+
| bestellung| feld_id   | text   |
+-----------+-----------+--------+
|     xyz01 |   vorname | Peter  |
|     xyz01 |   name    | Müller |
|     xyz01 |   strasse | ....   |
+-----------+-----------+--------+

etc.
Und in einer anderen Tabelle steht dann, was xyz01 überhaupt ist und ich dann Ticketanzahl erfahre…
Nun versuche ich halt das gerade etwas zusammen zu stückeln, damit er eben das Ganze ausdrucken kann. (Das Query dann als csv Exportieren)

Ich finde das auch nicht schön. Keine Ahnung was für ein Shopsystem das ist und ob das Ganze irgendwelche Vorteile hat, das so aufzubauen… hätte ich auch anders gemacht. Aber kann ich nicht ändern.

Aber danke für die Hilfe! Damit sollte ich nun zurecht kommen!

Ist ja vernünftig. Nennt sich Normalisierung. Wird aus meiner Sicht zu häufig nicht gemacht, ist aber ein Kernpfeiler der relationalen Datenbankerei.

Das ist doch perfekt. Ich würde denken, da hat jemand Ahnung. Ohne Quatsch. Das ist prima flexibel und kann jedes denkbare Formular in einer gemeinsamen Struktur abbilden. Das konnte man an deinem vorherigen Beispiel nicht erkennen. Ich nehme alles zurück, was ich vorher über die Datenbank gesagt habe. Für den konkreten Anwendungsfall taugt das sehr wohl.

Noch ein Hinweis: Bitte mach das nicht selbst, sonst bekommst du bestimmt Schwierigkeiten mit Zeilenumbrüchen und Semikolons in den Daten. Nimm unbedingt die CSV-Funktionen von PHP (das unterstelle ich jetzt einfach mal)

http://php.net/manual/de/function.fputcsv.php

1 Like

Jap. Wollte eigentlich auch fragen, was denn so falsch sein sollte, denn in bestimmten Fällen macht das durchaus Sinn.

Auf der Arbeit machen wir das auch so, da sehr viele sehr unterschiedliche Prozesse Daten ablegen wollen, und man nicht für jeden ne eigene Tabelle will. Zumal ist es egal, wenn man plötzlich ne „Spalte“ mehr braucht, und wenn man eine weniger braucht, hat man keine Platzverschwendung.

Vielleicht noch ein Problem der Tabelle in der Ursprungsfrage:
Wenn man Zeilen editiert, kann es sein, daß sie in der Tabellendatei, wenn man so will, weiter nach unten rutschen. Das heißt, die „natürliche“ Reihenfolge der Zeilen ändert sich, und aus 'Wie' 'gehts' wird plötzlich 'Gehts' 'Hallo, wie'. Wenn man ne Reihenfolge braucht, muß es noch irgendeinen Key geben, mit der sie sichergestellt werden kann. Und das ist ja jetzt gegeben.

1 Like