Mailinglisten-Archive |
On Thu, 19 Aug 1999 14:47:39 +0200, Martin Ramsch wrote: >Der Artikel ist in dieser Form - ohne Bezug zu einem konkreten DBMS - >sehr irreführend, denn ob bei der Ausführung der vom Ergebnis her >identischen Anweisungen > FROM a, b WHERE a.id=b.id ... >und > FROM a JOIN b ON a.id=b.id WHERE ... >intern ein Unterschied gemacht wird, hängt rein von der >Implementierung und evtl. Optimierungen des DBMS ab. Das dachte ich mir schon. >> Ziel: Ich will die personenanzahl aller orte, in denen die personen >> keiner niederlassung angehören. Dazu habe ich folgendes statement: >> >> select distinct(a.ort), count(a.id) as anzahl >> from person a, >> rel_niederlassung_person b >> where a.id != b.person_id >> group by ort >> order by ort > >Vorbemerkung: > DISTINCT(ort), ... tut etwas anderes, als Du vermutlich willst > (schließe ich aus der Klammernsetzung), denn > SELECT DISTINCT ... FROM > bedeutet (zumindest in MySQL), daß die Ergebnistupel gesamt (also > alle Ergebnisfelder als ein Wert zusammengenommen) unterschiedlich > sein müssen (die Klammern um a.ort sind für MySQL hier also kein > Teil von DISTINCT, sondern einfach unnötige, aber auch nicht > störende Klammern um a.ort). Somit wären (Passau, 5) und (Passau, > 6) mögliche Ergebnisse. In Deinem Beispiel kann aber aufgrund des > GROUP BY eh kein doppelter Ort vorkommen, weshalb Du das so nicht > bemerken wirst. Ok, die klammern sind also überflüssig. Das kommt davon, wenn man nicht zuviel in der doku liest ;)) >Zur SQL-Anfrage selbst: > Das funktioniert wirklich so? Kann ich nicht recht glauben ... > > Wenn ich das richtig verstehe, wird doch so pro Ort und pro Person > dieses Ortes jede andere in der Tabelle "rel_niederlassung_person" > vorkommende Person gezählt! Wenn ich "where a.id != b.person.id" benutze? Dann werden IMO alle records selektiert, deren id aus tabelle a _nicht_ der person_id der tabelle b entspricht. Genau das will ich ja. > Das ist nicht, was Du oben als Ziel angibst! Klarer formuliert: Ich will die anzahl aller personen zu jedem ort, für alle personen, die nicht einer niederlassung angehören. > Mein Lösungsvorschlag: > > SELECT a.ort, COUNT(*) AS anzahl > FROM person AS a LEFT JOIN rel_niederlassung_person AS b > ON a.id = b.id > WHERE b.id IS NULL > GROUP BY a.ort; Ist das gleiche ergebnis, nur ein paar 1/100 sek. langsamer als "where a.id != b.person_id". Momentan habe ich noch 4000 datensätze in der tabelle person, wird aber stark ansteigen (ca. 250.000). Daher ist gute performance extrem wichtig. > Oder wolltest Du nur die Orte, wo keine Person einer Niederlassung > angehört (plus die Anzahl dieser Leute)? Dann das hier: Nein. Danke für die ausführliche antwort. ciao amalesh -- Anwendungsentwicklung mit C++ JAVA VB PHP ASP SQL POET SGML XML http://www.living-source.com ~ ak_(at)_living-source.com ~ icq963380 Hamburg : Tel. 040-39904183 Fax. 040-39904328 Mob. 0170-4809618 Freiburg: Tel. 0761-152580 Fax. 0761-1525850 --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive