phpbar.de logo

Mailinglisten-Archive

verwickelte SQL-Abfrage mit JOIN's

verwickelte SQL-Abfrage mit JOIN's

Rico Koerner rico at netbreaker.de
Die Mai 22 09:45:05 CEST 2007


Sebastian Mendel schrieb:
> Rico Koerner schrieb:
>> Selektierende Parameter sollten nicht im JOIN sondern bei WHERE stehen, also
> 
> Wer sagt das? Und vor allem wieso?
> (Ich kenne diese Aussage, halte sie aber für unbegründet und einen Mythos)

Das sagt die MySQL-Dokumentation, das wieso solltest du dann wohl an die
Entwickler stellen. ;-)
Ich kann mir dafür mehrere Gründe vorstellen:
- bessere Übersichlichkeit (damit aber nicht wirklich relevant)
- Performanceunterschiede in der Ausführung (noch nicht evaluiert)
- wichtig für den Parser?
- einfach nur wegen dem SQL-Standard?
- Joins sind für die Verknüpfung von Tabellen zuständig.

Ich kenn die MyQSL-Internas nicht so genau und es funktioniert auch im
Join, zumindest sofern sich die Where-Bedingung auf die beiden Tabellen
des Joins bezieht. Den genauen Grund kennen wohl nur die Entwickler.

> Außerdem ist es kein Dogma sondern höchstens ein Paradigma.
> 
> Und zu guter letzte, es hilft dir zu deinem Ergebnis (natürlich richtig
> formuliert ;-) und nicht wie ich oben falsch)
> 
> 
>> die das 
>> "event" Ehename *nicht* zugeordnet haben und ansonsten entweder gar keine 
>> "events" haben (et.tag=NULL) oder auch irgendwelche anderen 
>> (description<>"Ehename").
> 
> LEFT JOIN
>        tng_eventtypes AS et
> ON     e.eventtypeID = et.eventtypeID
> AND    et.tag = 'EVEN'
> AND    et.description = 'Ehename';
> 
> (alle ohne einen event Ehename haben jetzt NULL in den et-Feldern)
> 
>> WHERE et.tag IS NULL OR ...
>>
>> vor allem auch OR, nicht AND denn es soll ja auch Datensätze liefern in
>> denen et.tag NOT NULL ist dafür aber et.description != 'Ehename'
> 
> nein nein, du willst alle außer die mit dem event Ehename

Doch, das OR ist schon richtig, er will alle ohne Event (et.tag IS NULL)
und alle mit ((et.tag NOT NULL) AND (et.description != 'Ehename'))

Die Bedingung lautete nicht et.tag = 'EVEN', da gabs auch noch ein
'OCCU' als möglichen Wert. Wieviel gibts da wohl noch?
Daher auch meine Prüfung auf
1. et.tag IS NULL (die wollte er alle und dort steht auch nix von
et.description = 'Ehename')
2. alle anderen, in denen nicht 'Ehename' steht.

Ein AND dazwischen würde ja nur bei et.tag IS NOT NULL nach den anderen
suchen.

> also, verknüpfts die deine Personen NUR mit genau diesem Ausschlusskriterium
> und filterst alle ungleich NULL aus (HAVING IS_NULL(et.tag))

Ach ja, HAVING gibts ja auch noch. ;-)

Gruß
Rico


_______________________________________________
Allgemeine Infos zur Liste: http://www.4t2.com/mysql/
Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de

php::bar PHP Wiki   -   Listenarchive