peter: 2-dimensionales Array aus MySQL-DB erzeugen?

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

  • 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.
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

  1. 你好 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

    --
    Nur die Weisesten und die Dümmsten können sich nicht ändern.
    http://wwwtech.de/
    1. 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

      1. 你好 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

        --
        Kommt ein Nullvektor zum Psychiater: "Herr Doktor, ich bin orientierungslos!"
        http://wwwtech.de/
        1. 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

          1. 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