Ankündigung

Einklappen
Keine Ankündigung bisher.

Unterarrays in Php nach Mysqlabfrage

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Unterarrays in Php nach Mysqlabfrage

    Hi,
    ich sitz seit Stunden an nem Problem und komm nicht weiter.
    Ich hab 2 Tabellen die ich über eine dritte, mittels der Indexe der ersten beiden Tabellen verknüpfe. Also eine Relationstabelle.

    tabelle1
    int id, varchar thema

    tabelle2
    int id, varchar kategorie

    jointabelle
    int idt1, idt2

    Über einen Join frage ich diese ab:

    Code:
    SELECT thema, kategorie  FROM (tabelle1,tabelle2)
      LEFT JOIN jointabelle ON
        ((tabelle1.id=jointabelle.idt1) AND
        (tabelle2.id=jointabelle.idt2))
    Das funktioniert soweit auch. (Hab die Variablen und Tabellen hier mal vereinfacht dargestellt, weil die originale viel komplexer sind)

    Mein Problem ist das die Ergebnisse bei folgender Datenmenge
    Code:
    Bsp:
    Tabelle 1
    id thema
    1  ja
    2  nein
    3  vielleicht
    
    Tabelle 2
    id kategorie
    1 relevant
    2 unrelevant
    
    Jointabelle
    idt1  idt2
     1     1
     1     2
     2     1
     3     1
     3     2
    dann als Ergebnis einen ganzen Haufen Datensätze erhalte. Also bei der Auswertung dann der Reihe nach immer wieder indexe von Tabelle 1 doppelt:

    Code:
    ja - relevant
    ja - unrelevant
    nein - relevant
    vielleicht - relevant
    vielleicht - unrelevant
    Gibt es denn in Mysql eine Möglichkeit die Daten so zu gruppieren das ich sie einfacher auswerten könnte?
    Also zum Beispiel eine Möglichkeit es so zusammenzufassen das die kategorie als array zum jeweiligen Objekt hinzugefügt wird. Also Bspw.

    Code:
    $row->kategorie[0]  (relevant)
    $row->kategorie[1]  (unrelevant)
    Falls das nicht möglich ist, wäre ich auch mit der Möglichkeit einer Zeichenkette mit Trennzeichen zufrieden. Also Bspw.:

    "relevant|unrelevant" (Mit | als Trennzeichen).

    So wies jetzt ist kanns nicht bleiben - ich hab viel zu viele Daten doppelt erhalten. Hab schon versucht das über

    GROUP BY thema

    zu gruppieren - aber dann erhalte ich nur noch jeweils eine Kategorie zugeordnet..
    Danke schonmal im Vorraus..


  • #2
    Zitat von soundFXon Beitrag anzeigen
    Über einen Join frage ich diese ab:

    Code:
    SELECT thema, kategorie  FROM (tabelle1,tabelle2)
      LEFT JOIN jointabelle ON
        ((tabelle1.id=jointabelle.idt1) AND
        (tabelle2.id=jointabelle.idt2))
    Hier mischt Du Theta-JOIN mit ANSI-JOIN Technik, dass ist nicht zu empfehlen, weil nicht sehr übersichtlich ist. Hat aber nichts mit dem eigentlichen Problem zu tun.

    Zitat von soundFXon Beitrag anzeigen
    dann als Ergebnis einen ganzen Haufen Datensätze erhalte. Also bei der Auswertung dann der Reihe nach immer wieder indexe von Tabelle 1 doppelt:

    Code:
    ja - relevant
    ja - unrelevant
    nein - relevant
    vielleicht - relevant
    vielleicht - unrelevant
    Das Ergebnis ist ja soweit korrekt. Ich habe es mal wie folgt nachgestellt.

    Code:
    CREATE TABLE tabelle1 (
     id INT NOT NULL,
     thema VARCHAR(20) NOT NULL
    );
    
    INSERT INTO tabelle1 VALUES
    ( 1, 'ja'),
    ( 2, 'nein'),
    ( 3, 'vielleicht');
    
    CREATE TABLE tabelle2 (
     id INT NOT NULL,
     kategorie VARCHAR(20) NOT NULL
    );
    
    INSERT INTO tabelle2 VALUES
    ( 1, 'relevant'),
    ( 2, 'unrelevant');
    
    CREATE TABLE jointabelle (
     idt1 INT NOT NULL,
     idt2 INT NOT NULL
    );
    
    INSERT INTO jointabelle VALUES
    ( 1, 1),
    ( 1, 2),
    ( 2, 1),
    ( 3, 1),
    ( 3, 2);
    
    
    SELECT t1.thema, t2.kategorie  
      FROM tabelle1 t1
      JOIN jointabelle jt
        ON jt.idt1 = t1.id
      JOIN tabelle2 t2
        ON t2.id = jt.idt2
    ORDER BY t1.thema;
    
    +------------+------------+
    | thema      | kategorie  |
    +------------+------------+
    | ja         | relevant   |
    | ja         | unrelevant |
    | nein       | relevant   |
    | vielleicht | unrelevant |
    | vielleicht | relevant   |
    +------------+------------+
    5 rows in set (0.03 sec)
    
    mysql>
    Zu dem möglichen GROUP fällt mir (nur bei MySQL) noch der GROUP_CONCAT ein.

    Code:
    SELECT t1.thema, GROUP_CONCAT(t2.kategorie SEPARATOR ' | ')  
      FROM tabelle1 t1
      JOIN jointabelle jt
        ON jt.idt1 = t1.id
      JOIN tabelle2 t2
        ON t2.id = jt.idt2
    GROUP BY t1.thema
    ORDER BY t1.thema;
    
    +------------+--------------------------------------------+
    | thema      | GROUP_CONCAT(t2.kategorie SEPARATOR ' | ') |
    +------------+--------------------------------------------+
    | ja         | relevant | unrelevant                      |
    | nein       | relevant                                   |
    | vielleicht | unrelevant | relevant                      |
    +------------+--------------------------------------------+
    3 rows in set (0.07 sec)
    
    mysql>
    Grüße
    Thomas

    Kommentar


    • #3
      Zitat von thomas_w Beitrag anzeigen
      Hier mischt Du Theta-JOIN mit ANSI-JOIN Technik, dass ist nicht zu empfehlen, weil nicht sehr übersichtlich ist. Hat aber nichts mit dem eigentlichen Problem zu tun.
      Oha. Das kommt wohl daher das ich das ganze von nem Programmiersprachen-Standpunkt aus gesehen hab. Ist denn die Methode mit mehreren JOINS effektiver, bzw. performanter? Übersichtlicher ist sie ja allemal. Auch wenn ich mir erst mal verinnerlichen muss was da jetzt genau passiert.

      Zitat von thomas_w Beitrag anzeigen
      SELECT t1.thema, GROUP_CONCAT(t2.kategorie SEPARATOR ' | ')
      Thomas
      Danke, genau nach sowas hab ich gesucht. Schöner wärs nur noch über ein mehrdimensionales Array, bzw einen objektorientierten Ansatz. Aber, nachdem ich mich da jetzt ne Weile eingelesen habe, scheint sowas mit SQL nicht möglich zu sein. Also das Erzeugen von mehrdimensionalen Arrays, oder Objektorientierten Datensätzen als Rückgabewert?

      Ansonsten gefällt mir das so ganz gut. Vielen Dank.

      Kommentar

      Lädt...
      X