phpbar.de logo

Mailinglisten-Archive

verwickelte SQL-Abfrage mit JOIN's

verwickelte SQL-Abfrage mit JOIN's

Sebastian Mendel lists at sebastianmendel.de
Die Mai 22 09:04:20 CEST 2007


Rico Koerner schrieb:
> Sebastian Mendel schrieb:
>> Ulrich Kretschmer schrieb:
>>> Hallo zusammen,
>>>
>>> die folgende Abfrage
>>>
>>> SELECT familyID, w.personID, w.lastname, w.firstname, et.tag, et.description, 
>>> e.info FROM tng_families AS f 
>>> INNER JOIN tng_people AS w ON (f.wife=w.personID AND f.gedcom=w.gedcom) 
>>> LEFT JOIN tng_events AS e ON (w.personID=e.persfamID AND w.gedcom=e.gedcom)
>>> LEFT JOIN tng_eventtypes AS et ON e.eventtypeID=et.eventtypeID;
>>>
>>> verbindet die Tabellen 
>>> 	tng_eventypes -> tng_events -> tng_people -> tng_families 
>>> und soll so modifiziert werden, daß alle Personen geliefert werden, die das 
>>> "event" Ehename *nicht* zugeordnet haben und ansonsten entweder gar keine 
>>> "events" haben (et.tag=NULL) oder auch irgendwelche anderen 
>>> (description<>"Ehename").
>> ich glaub ich hab null verstanden was du willst, vielleciht liegt es ander
>> Uhrzeit ...
>>
>> aber probier doch mla sowas wie
>>
>> ...
>> LEFT JOIN
>>        tng_eventtypes AS et
>> ON     e.eventtypeID = et.eventtypeID
>> AND    et.tag = NULL
>> AND    et.description = 'Ehename';
> 
> 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)

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

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


> Ich frage mich aber gerade ob die Tabellen ausreichend normalisiert
> sind. Oder waren die Beispielzeilen schon die Ausgabe?

ja, das sieht man von hieraus nicht ... ;-)


-- 
Sebastian Mendel

www.sebastianmendel.de
_______________________________________________
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