MySQL über 2 Tabellen mit mehrfach Treffer
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
abfragen
array
auslese
ausprobieren
beispiel
code
dank
datum
dokumentation
echten daten
ergebnis
grundlage
haupt
info
ressource
tabelle
treffer
unterschied
url
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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? -
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
-
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. ;)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage