Mailinglisten-Archive |
Hallo Ruprecht. Am Mon, 08 Jan 2001 schrieb Ruprecht Helms: > >Um die Mitglieder anzuschreiben und die Briefe über die Kinder zu > >verteilen brauche ich zum einen die Mitglieds-Daten und zum anderen die > >Namen der Kinder. Das mache ich über eine LEFT JOIN: > >select mitgl.Name, mitgl.Adr, kind.Vname, kind.Klasse from mitgl left join > >kind using (MID) where ... > > > >Nun bekomme ich aber bei den Mitgliedern mit mehreren Kinder auch > >ebensoviele Datensätze! > > Sowas geht nur über ein Script, das die Tabellen getrennt > durchforstet. Damit meine ich, dass in der Elterntabelle zuerst > abgegriffen wird und dann in einer zweiten Schleife für die zugehörigen Kinder. Und es geht doch: select mitgl.Name, mitgl.Adr, kind.Vname, max(kind.Klasse) from mitgl left join kind using (MID) where ... group by Name allerdings hab ich jetzt noch das Problem, dass das Kind nicht unbedingt zur ausgegebene Klasse passt, aber das findet sich hoffentlich noch. > Deins ist das typische Problem bei Datenbanken. Bei solchen Abfragen wird > ein sogenanntes Kartesisches Produkt gebildet, d. h. die Tabellen, aus > denen die Ergebnisse gebildet werden, werden multipliziert. Um aus diesem Salat dann das gewünschte herauszufiltern hat man ja sowas wie WHERE, LEFT JOIN etc. > Dies ist nicht nur bei mysql so, sondern auch Oracle, SQL-Server, Access, ... Die haben dafür aber Subselects, Unions usw. Denn nicht immer lässt sich ein Script dazwischen schalten, so wie bei mir. Ciao, Rene -- --- *** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive