Mailinglisten-Archive |
On 13-May-2002 Guenther Theilen wrote: > Moin allerseits, > > anscheinend habe ich bei der Verknüpfung von Tabellen irgendwas falsch > verstanden. Ich habe eine Tabelle, die Orte nach Land, Bundesland, > Region, Gebiet ordnet. > Aufbau: id | parent | name > Wobei parent immer auf den zugehörigen, übergeordneten Eintrag verweist. > Der Eintrag für das Bundesland "Niedersachsen" hat also zum Beispiel bei > parent den Wert für den Eintrag "Deutschland". > Alle Länder haben parent=0, da es dort keine übergeordneten Eintraege > gibt. > Soweit, so gut. > Jetzt möchte ich alle Länder und Bundesländer aus der Tabelle holen: > > SELECT id, parent, name FROM tabelle WHERE parent="0" > gibt mir die Länder > > SELECT a.id, a.parent, a.name > FROM tabelle AS a, tabelle AS b > WHERE a.parent=b.id AND b.parent="0" > gibt mit die Bundesländer > > SELECT a.id, a.parent, a.name > FROM tabelle AS a, tabelle AS b > WHERE (a.parent='0') OR (a.parent=b.id AND b.parent='0') > gibt nicht Länder und Bundesländer sondern totalen Unfug > > Wo ist da mein Denkfehler? Lass mich raten: dein Ergebnis besteht aus allen Laendern sehr oft + die Bundeslaender? Ganz einfach: du machst da oben einen Cross Join, d.h., due erzeugst temporaer eine Tabelle, die aus tabelle X tabelle besteht,und mit der Where-Bedingung streichst du da alle raus, die eben die Bedingung nicht erfuellen. Durch das OR gibts aber ein paar dumme Effekte - z.B alle Zeilen aus tabelle X tabelle, die a.parent=0 erfuellen (das sind pro eintrag in a, der die Bedingung erfuellt soviele Zeilen, wie tabelle Zeilen enthaelt!) gelangen ins Result der Query. Michael -- michael Bergbauer <michael_(at)_noname.franken.de> Use your idle CPU cycles. See http://www.distributed.net and win $ 1 000. Visit our mud Geas at geas.franken.de Port 3333 --- Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter -->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive