kostenloser Webspace werbefrei: lima-city


MySQL über 2 Tabellen mit mehrfach Treffer

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    tela

    tela hat kostenlosen Webspace.

    Hallo

    ich habe 2 Tabellen, über die ich eine kombinierte Anfrage machen will

    Problem dabei ist, das zur ID aus der Tabelle1 mehrere Einträge in Tabelle2 sein können

    Tabelle1
    --------------------------------- 
    id	name	spalte3
    --------------------------------- 
    1	AAAA	...
    2	BBBB	...
    3	YYYY	...
    
    
    Tabelle2
    --------------------------------- 
     refid	info	mehr
    --------------------------------- 
     1	12	a
     2	99	b
     1	34	c
     3	85	d
     1	27	e
     2	56	f


    Also für die id aus Tabelle1 gibt es mehrere Treffer in Tabelle2

    wie kann ich eine Abfrage machen, in der das Ergebnis nicht mehrfach da ist
    sondern die Treffer aus Tabell2 als Sub-Array

    BSP:

    $gouid = 2; 
    
    $sql = "
    SELECT `tabelle1`.*, `tabelle2`.*
    FROM `tabelle1`
    LEFT JOIN `tabelle2` ON `tabelle2`.`refid` = `tabelle1`.`id`
    WHERE `tabelle1`.`id` = '{$gouid}'
    ";


    damit bekomme ich aber in jedem Treffer nochmal alle Daten aus tabelle1
    also

    array( 
      [0] => array(
                 [id] => 2
                 [name] => BBBB
                 [spalte3] => ...
                 [refid] => 2
                 [info] => 99
                 [mehr] => b
                )
      [1] => array(
                 [id] => 2
                 [name] => BBBB
                 [spalte3] => ...
                 [refid] => 2
                 [info] => 56
                 [mehr] => f
                )


    ich hätte es aber gerne so

    array( 
      [0] => array(
                 [id] => 2
                 [name] => BBBB
                 [spalte3] => ...
                 [refid] => 2
                 [info] => array(
                                 [0] => 99
                                 [1] => 56
                             )
                 [mehr] => array(
                                 [0] => b
                                 [1] => f
                             )
                )


    Unterschied sieht jetzt im BSP nicht groß aus,
    aber mit echten Daten ist die zweite (gewünschte) Version deutlich kürzer

    also .. wiet alle Daten zur Haupt-Id in einem Ergebnis (Array)
    wenn mehrfache Treffer aus Tabelle2 dann als Sub-Array im Ergebnis

    geht das überhaupt direkt in der Abfrage, wenn mehrere Treffer, diese als Array

    oder wie sonst Abfrage über 2 Tabellen mit mehreren (möglichen) Treffern aus der 2ten Tabelle ?


    ok, es geht mit mehreren SQL-Abfragen in einer while-Schleife

    (zur Info, es kann auch mal nach mehreren Haupt-IDs gefragt sein)

    $result = mysql_query( "SELECT * FROM `tabelle1` WHERE `id` = '{$gouid}' ); 
    $data= array(); 
    
    $n=0; 
    while($row = mysql_fetch_assoc($result)) { 
    
      $data[$n] = $row; 
    
      $result2 = mysql_query("SELECT * FROM tabelle2 WHERE refid='{$row['id']}' "); 
    
      while($row2 = mysql_fetch_assoc($result2)) { 
         $data[$n]['info'][] = $row2['info']; 
         $data[$n]['mehr'][] = $row2['mehr']; 
      }
    
      $n++; 
    }


    aber mit sowas sendet man ja schnell mal einige (viele) MySQL-Abfragen an den Server,
    deshalb bin ich auf der Suche, wie ich das evtl. Ressourcen-schonender machen kann.



    Beitrag zuletzt geändert: 25.8.2012 17:04:03 von tela
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hier das sollte so funktionieren:
    $sql = "
    SELECT `tabelle1`.`id`, `tabelle1`.name, `tabelle1`.spalte3, group_concat(`tabelle2`.info SEPARATOR ';') as concated_info, group_concat(`tabelle2`.mehr SEPARATOR ';') as concated_mehr
    FROM `tabelle1`
    /* LEFT*/ JOIN `tabelle2` ON `tabelle2`.`refid` = `tabelle1`.`id`
    WHERE `tabelle1`.`id` = '{$gouid}'
    GROUP BY
    `tabelle1`.`id`
    ";
    $result = mysql_query($sql); 
    $data= array(); 
     
    while($row = mysql_fetch_assoc($result)) { 
     
     
      $row['info'] = explode(';', $row2['concated_info']);
      $row['mehr'] = explode(';', $row2['concated_mehr']);
      
      unset($row2['concated_info'], $row2['concated_mehr']);
     
      $data[] = $row; 
    }

    Warum hast du den einen LEFT JOIN gemacht?
    Weißt du den was das heißt?
  4. Autor dieses Themas

    tela

    tela hat kostenlosen Webspace.

    Danke, werde es gleich ausprobieren


    philippkern schrieb:
    Warum hast du den einen LEFT JOIN gemacht?
    Weißt du den was das heißt?


    nein, nicht wirklich, ich habe halt nach "MySQL zwei Tabellen auslesen" gegoogelt
    und sowas als Beispiel gefunden ...

    was ist der Unterschied zwischen "JOIN" und "LEFT JOIN" ??

    und GROUP_CONCAT() ist mir auch neu, scheint je recht nützlich zu sein,
    um nicht zu sagen: fast unverzichtbar,
    wenn man Ergebnisse mit mehrfach-Treffer aus 2 Tabellen holen will

    ich glaub ein gutes Erklär-Beispiel dazu auch hier gefunden zu haben

    Danke, wieder was "Neues" (für mich) dazu gelernt, ... :)
    in den meisten MySQL Tutorials geht es leider ja meist nicht so "Tief"
    die Grundlagen sind schnell kapiert, aber da steckt deutlich mehr dahinter, wenn man etwas "Komplexere" Abfragen will
    und meine ist ja noch immer eher "einfach" ... uiiii da kann ich sicher noch viel dazulernen
  5. Also LEFT JOIN würde in deinem Fall zB bewirken das du auch Daten von Tabelle1 bekommen würdest auch wenn die ON clause nicht true ist, also wenn auch wenn keine passenden Reihen in Tabelle2 gefunden wurden.
    Aber vielleicht willst du ja genau auch das haben.
    In dem Fall würde LEFT JOIN natürlich passen.

    GROUP_CONCAT hab ich auch noch nie verwendet also bin gespannt. ;)
    Zu beachten wäre das die maximale Länge davon standardmäßig nur 1024 Zeichen sind.
    Steht in der Dokumentation also nur damit dus weißt. ;)
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!