2-dimensionales Array aus MySQL-DB erzeugen?
peter
- datenbank
hi,
ich hab da ein Problem, das mir meine sämtlichen Hirnwindungen verknotet und ich komm einfach nicht drauf.
Ist wahrscheinlich recht einfach, aber ich bin MySQL-Anfänger und einfach noch nicht so fit in der speziellen Denkweise, erwarte auch keine fertigen Lösungen, wäre einfach für eure Hilfe/Denkanstöße äußerst dankbar.
Folgender Fall:
Mehrere Vereine sind in der Tabelle VEREIN gespeichert.
Vereinsmitglieder sind in der Tabelle MITGLIED gespeichert.
Die Vereinsmitglieder können jeweils einem oder mehreren Vereinen angehören.
Die Vereinszugehörigkeit ist in der Tabelle VM gespeichert.
Tabellen:
VEREIN
+----+----------+
| id | name |
+----+----------+
| 1 | verein a |
+----+----------+
| 2 | verein b |
+----+----------+
MITGLIED
+----+----------+
| id | name |
+----+----------+
| 1 | person 1 |
+----+----------+
| 2 | person 2 |
+----+----------+
| 3 | person 3 |
+----+----------+
| 4 | person 4 |
+----+----------+
VM
+-----+-----+
| Vid | Mid |
+-----+-----+
| 1 | 1 |
+-----+-----+
| 1 | 2 |
+-----+-----+
| 1 | 3 |
+-----+-----+
| 2 | 2 |
+-----+-----+
| 2 | 3 |
+-----+-----+
| 2 | 4 |
+-----+-----+
Ausgabe soll dann am Ende sein:
verein a
verein b
Hätte dazu am liebsten direkt aus der sql-SELECT -Abfrage als Rückgabewert ein zweidimensionales Array, das die entsprechenden Elemente enthält.
Glaube aber, das geht gar nicht.
Oder kann MySQL 2-dim. Arrays zurückgeben ?
Wie kann man das sonst am schnellsten und effektivsten bewerkstelligen?
Muß ich dazu 2 SELECT- Abfragen nacheinander durchführen (erst die Vereine erfragen und dann die entsprechenden Mitglieder raussuchen)?
gruß
peter
你好 peter,
VEREIN
+----+----------+
| id | name |
+----+----------+
| 1 | verein a |
+----+----------+
| 2 | verein b |
+----+----------+MITGLIED
+----+----------+
| id | name |
+----+----------+
| 1 | person 1 |
+----+----------+
| 2 | person 2 |
+----+----------+
| 3 | person 3 |
+----+----------+
| 4 | person 4 |
+----+----------+VM
+-----+-----+
| Vid | Mid |
+-----+-----+
| 1 | 1 |
+-----+-----+
| 1 | 2 |
+-----+-----+
| 1 | 3 |
+-----+-----+
| 2 | 2 |
+-----+-----+
| 2 | 3 |
+-----+-----+
| 2 | 4 |
+-----+-----+Ausgabe soll dann am Ende sein:
verein a
- person 1
- person 2
- person 3
verein b
- person 2
- person 3
- person 4
Hätte dazu am liebsten direkt aus der sql-SELECT -Abfrage als
Rückgabewert ein zweidimensionales Array, das die entsprechenden Elemente
enthält.
Nun, da musst du mit JOINs arbeiten. Eine moegliche Loesung (ungetestet)
waere:
$res = mysql_query("
SELECT
verein.name,mitglied.name
FROM
verein
LEFT JOIN
vm ON vm.vid = verein.id
LEFT JOIN
mitglied ON miglied.id = vm.mid;");
$ary = Array();
while($row = mysql_fetch_row($res)) {
$ary[$res[0]][] = $row[1];
}
Damit hast du einen zweidimensionalen Array der von dir gewuenschten Form.
再见,
CK
hi CK,
vielen Dank erstmal für deine Antwort.
So richtig kann ich die untenstehende DB-Abfrage noch nicht nachvollziehen, da kämpf ich mich gerade durch wie das alles so funktioniert mit den JOINS, LEFT JOIN, ON, .......
Gibts da irgendwo im Netz ne übersichtliche (Kurz-)Anleitung/Befehlsreferenz dazu?
Nun, da musst du mit JOINs arbeiten. Eine moegliche Loesung (ungetestet)
waere:$res = mysql_query("
SELECT
verein.name,mitglied.name
FROM
verein
LEFT JOIN
vm ON vm.vid = verein.id
LEFT JOIN
mitglied ON miglied.id = vm.mid;");
Wenn ichs recht verstehe, bringt mir die Datenbakabfrage folgendes Ergebnis:
+----------+----------+
| verein a | person 1 |
+----------+----------+
| verein a | person 2 |
+----------+----------+
| verein a | person 3 |
+----------+----------+
| verein b | person 2 |
+----------+----------+
| verein b | person 3 |
+----------+----------+
| verein b | person 4 |
+----------+----------+
...welches ich dann mit php in meine gewünschte Array-Struktur bringen muß:
$ary = Array();
while($row = mysql_fetch_row($res)) {
$ary[$res[0]][] = $row[1];
}
Sollte ich das richtig verstanden haben, müßte es dann aber nicht so aussehen ???:
$ary = Array();
while($row = mysql_fetch_row($res)) {
$ary[$row[0]][] = $row[1]; }
^^^
gruß
peter
你好 peter,
[... JOINs ...]
Gibts da irgendwo im Netz ne übersichtliche
(Kurz-)Anleitung/Befehlsreferenz dazu?
Kenne keine, sorry.
Wenn ichs recht verstehe, bringt mir die Datenbakabfrage folgendes
Ergebnis:+----------+----------+
| verein a | person 1 |
+----------+----------+
| verein a | person 2 |
+----------+----------+
| verein a | person 3 |
+----------+----------+
| verein b | person 2 |
+----------+----------+
| verein b | person 3 |
+----------+----------+
| verein b | person 4 |
+----------+----------+...welches ich dann mit php in meine gewünschte Array-Struktur bringen
muß:
Ja, das ist korrekt.
$ary = Array();
while($row = mysql_fetch_row($res)) {
$ary[$res[0]][] = $row[1];
}Sollte ich das richtig verstanden haben, müßte es dann aber nicht so
aussehen ???:$ary = Array();
while($row = mysql_fetch_row($res)) {
$ary[$row[0]][] = $row[1]; }
^^^
Jepp, du hast recht. Ich sagte ja, ungetestet :)
再见,
CK
hi
[... JOINs ...]
Gibts da irgendwo im Netz ne übersichtliche
(Kurz-)Anleitung/Befehlsreferenz dazu?Kenne keine, sorry.
trotzdem Danke für die Antwort, war ja auch wichtig zu wissen, ob ich das richtig verstanden hatte.
Werd mich halt durch das 700 Seiten -PDF durchkämpfen und mich durch die Bücher durchwühlen, die ich hier so habe.
Ist halt erstmal alles ziemlich unübersichtlich für mich.
Hab noch nie was mit Datenbanken gemacht.
Und die Erklärungen sind meistens in irgendwelchen Beispielen verstreut.
Ich finde einfach nirgends eine ausführliche Erklärung/Aufstellung von Erklärungen, was ein JOIN macht, was ein ON macht, was ein INNER JOIN macht, was ein LEFT JOIN macht...............
Thanks nochmal und schönen Tag noch...
peter
yo,
Ich finde einfach nirgends eine ausführliche Erklärung/Aufstellung von Erklärungen,
was ein JOIN macht
ein JOIN ist quasi eine verbindung von zwei tabellen. wird nicht weiter mit angegeben, wie sie miteinander verbunden werden sollen, wird ein sogenannter kreuz-join ausgeführt, sprich jeder datensatz der einen tabelle wird mit jedem datensatz der anderen tabelle verbunden. bei 100 datensätzen in der ersten tabelle und 50 datensätze in der zweiten tabelle würden dabei 100 * 50 = 5000 datensätze rauskommen.
was ein ON macht
leitet meines wissen unter mysql die bedingung eines joins ein, da man in aller regel eher selten einen kreuz-join ausführen will. es ist quasi ein "hilfswort" wie FROM oder WHERE.
was ein INNER JOIN macht
wie gesagt, nur selten will man einen kreuz-join. und dabei unterscheidet man, welche art von join man ausführen will. der inner join ist dadurch spezifiziert, dass die join bedingung immer erfüllt sein muss, damit der datensatz in die ergebnismenge aufgenommen wird. beispiel, bein einem artikel steht ein ländercode dabei. in einer anderen tabelle steht nun der klartext des landes zu jedem entsprechenden ländercode. jeder ländercode in der artikeltabelle trifft auf einen entsprechenden ländercode in der länder tabelle. das wäre ein typischer inner join.
was ein LEFT JOIN macht
es gibt aber auch datensätze, da will man auf jeden fall, dass der datensatz aus der "ersten" tabelle genommen wird, egal ob es einen entsprechendenen gegenpart in der zweiten tabele gibt oder nicht. wenn es ihn gibt, zeig ihn mit an, wenn nicht, nimm den datensatz trotzdem und fülle die entsprechenden werte der zweiten tabelle mit NULL auf. als beispiel gebe ich hier immer die mitarbeiter an, wo auch deren kinder mit angezeigt werden sollen. es sollen auf jeden fall alle mitarbeiter angeziegt werden und wenn sie kinder haben, dann auch diese. bei einem inner join würden aber die mitarbeiter ohne kinder einfach wegfallen, was aber nicht gewünscht ist.
Ilja