PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mysql: Daten aus zwei Tabellen abfragen.


Mr.Y
2008-02-26, 17:38:46
Ich habe eine Webseite, auf der ich bisher nach folgendem Schema vorgegangen bin:
$res = mysql_query("SELECT id, feld1, feld2 FROM spalte1 WHERE id = 1 ");
$rows = mysql_fetch_array($res);

$result = mysql_query("SELECT id, feld1, feld2 FROM spalte2 WHERE id = 1 AND feld1 = '".$rows['id']."'") or die(mysql_error());
$row = mysql_fetch_array($result);

Wie kann ich die beiden Abfragen zu einer zusammenfassen? Ist das überhaupt sinnvoll? Wie sieht es mit der Performance aus?
Danke im Voraus

Berni
2008-02-26, 19:20:03
Also in der Regel sollte hiersowas in der Art anzuwenden sein:
SELECT * FROM spalte1 LEFT JOIN spalte2 ON spalte1.id=feld1.id WHERE spalte1.id = 1
Vorteil ist die Reduzierung der Abfragen von 2 auf 1. Ob das insgesamt einen Performancevorteil bringt hängt von vielen Faktoren ab, z.B. von den gesetzten/benutzten Indizes (mit EXPLAIN <SQL-Abfrage> kann man das sehen!), der Tabellengröße, der Abfragerate des Skriptes, der Einstellungen des SQL-Servers usw.

Gast
2008-02-26, 20:33:29
Ich bin wohl zu blöd dafür, also mache ich es mal an einem konkreten Beispiel:
$results = mysql_query("SELECT id, title, link FROM web WHERE id = 1 LIMIT 1") or die(mysql_error());
$rows = mysql_fetch_array($results);

$result = mysql_query("SELECT title, inhalt FROM baum WHERE id = 2 AND quelle = '".$rows['id']."' LIMIT 1") or die(mysql_error());

wird zu:
SELECT * FROM web LEFT JOIN baum ON web.id=feld1.id ??? WHERE web.id = 1
Man, dieses MySQL raubt mir den letzten Nerv.

PS: Ist für die Schule. Die ganzen netten Anleitungen auf http://dev.mysql.com/doc/refman/5.1/de/join.html bringen mich auch nicht wirklich weiter. Kennt jemand eine einfache Schritt für Schrittanleitung? Sowas wie schattenbaum (ja, damit habe ich php damals angefangen)

Matrix316
2008-02-26, 21:49:42
Je nach dem was als Ergebnis drinnen sein soll, kannste left join oder inner join oder cross join oder right join nehmen. Gibt auch z.B. left outer join.

Allerdings müsste auch sowas gehen:

"SELECT id, feld1, feld2 FROM spalte2 WHERE id = 1 AND feld1 = (select ID from spalte1 where spalte1.ID = 1) "

(wobei hier feld1 = 1 ;) )

Berni
2008-02-26, 23:37:03
Sorry, hatte meinen Befehl falsch geschrieben, daher stimmt deiner auch nicht.
Bei mir müsste es so heißen:
SELECT * FROM spalte1 LEFT JOIN spalte2 ON spalte1.id=spalte2.feld1 WHERE spalte1.id = 1
Bei dir dann
SELECT * FROM web LEFT JOIN baum ON web.id=baum.feld1 WHERE web.id = 1
Damit wird die Tabelle "web" mittels der Spalte "id" auf die Tabelle "baum" mit dem Fremdschlüssel "feld1" gejoint.