Mailinglisten-Archive |
This is a MIME encapsulated multipart message - please use a MIME-compliant e-mail program to open it. Dies ist eine mehrteilige Nachricht im MIME-Format - bitte verwenden Sie zum Lesen ein MIME-konformes Mailprogramm. --========GMXBoundary91921006434238 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit > Hi, > > > > > zeig uns doch mal den Aufbau deiner Tabelle und ein paar Testdaten, > > dann muessen wir nicht ins Blaue hinein raten. > ok hier : > > > So wie ich dein Performance-Problem verstehe, solltest du die Tabelle mit Pointern durchlaufen und nicht in einem SQL-Query verarbeiten. Abgesehen davon hast du in deinem DB-Konzept einen bösen Sschnitzer, weil der Nachnahme kein eindeutiger Schlüssel sein kann. Da hast du meinetwegen zwei Väter "Meier", deren Söhne dann aber völlig konfus zugeordnet werden würden, deinem Query nach. Jede Person braucht einen künstlichen Schlüssel. Und jeder Sohn bekommt einen Fremdschlüssel, der auf den Vater verweist. Tabelle Mitglieder (vereinfacht dargestellt): ----------------- ID LONGINT PRIOMARY KEY NOT NULL, NAME VORCHAR, VORNAME VARCHAR, STRASSE VARCHAR, ISTVATER BOOLEAN, ISTSOHNVON LONGINT Du gehst dann in zwei unterschiedlichen Abfragen einmal alle Personen durch, die Vater sind (SELECT ... FROM ... WHERE ISTVATER = TRUE), dann gehst du in einem zweiten Query in einer Unterroutine alle Söhne des Vaters durch (SELECT ... FROM ... WHERE ISTSOHNVON = andereID) so in etwa. Die Vornamen sammelst du in einem String und gibst sie dann in der Unterroutine zu dem Array für den Vater, mit dem du dann später weiter arbeitest. Noch Fragen? ciao! Kai -- GMX - Die Kommunikationsplattform im Internet. http://www.gmx.net --========GMXBoundary91921006434238 Content-Type: text/plain; name="selfjoin.txt" Content-Transfer-Encoding: quoted-printable Tabelle (mitglieder) mit mannlichen Migliedern eines Vereins. Zumeist Vater und S=F6hne: _______________________________ |name |vorn |strasse |status| |______|_____|_________|______| |Peters|Klaus|Forstweg |Vater | |------+-----+---------+------| |Peters|Sven |Forstweg |Sohn | |------+-----+---------+------| |Hansen|Peter|Baumallee|Vater | |------+-----+---------+------| |Hansen|Udo |Baumallee|Sohn | |------+-----+---------+------| |Hansen|Sepp |Baumallee|Sohn | |------+-----+---------+------| |Jahnke|Kurt |Dorfallee|Vater | |------+-----+---------+------| |Volmer|Hans |Krausestr|Sohn | |------+-----+---------+------| |Kuehne|Joern|Krausestr|Vater | |------+-----+---------+------| Es soll jedem Vater seine Soehne zugeordnet werden. V=E4ter ohne S=F6hne werden aufgelistet. S=F6hne ohne Vater werden NICHT aufgelistet. Ergebnis soll in etwa so aussehen: ___________________________________ |name |vorn |strasse |soehne | |______|_____|_________|__________| |Peters|Klaus|Forstweg |Sven | |------+-----+---------+----------| |Hansen|Peter|Baumallee|Udo, Sepp | |------+-----+---------+----------| |Jahnke|Kurt |Dorfallee| | |------+-----+---------+----------| |Kuehne|Joern|Krausestr| | |------+-----+---------+----------| Folgendes Statement dauert ewig (ca. 2400 Datensa=E4tze) und produziert = nat=FCrlich f=FCr jede Beziehung eine neue Zeile: SELECT a.name as name, a.vorname as vorn, a.strasse as strasse, b.vorname as sohn FROM mitglieder a LEFT JOIN mitglieder b ON (a.name=3Db.name) AND (a.strasse=3Db.strasse) AND (b.status like 'Sohn') WHERE (a.status =3D 'Vater')=20 ___________________________________ |name |vorn |strasse |sohn | |______|_____|_________|__________| |Peters|Klaus|Forstweg |Sven | |------+-----+---------+----------| |Hansen|Peter|Baumallee|Udo | |------+-----+---------+----------| |Hansen|Peter|Baumallee|Sepp | |------+-----+---------+----------| |Jahnke|Kurt |Dorfallee|NULL | |------+-----+---------+----------| |Kuehne|Joern|Krausestr|NULL | |------+-----+---------+----------| Zum testen: CREATE TABLE mitglieder ( name char(20) NOT NULL default '', vorname char(20) NOT NULL default '', strasse char(20) NOT NULL default '', status char(20) NOT NULL default '' ) TYPE=3DMyISAM; INSERT INTO mitglieder VALUES ('Peters', 'Klaus', 'Forstweg', 'Vater'); INSERT INTO mitglieder VALUES ('Peters', 'Sven', 'Forstweg', 'Sohn'); INSERT INTO mitglieder VALUES ('Hansen', 'Peter', 'Baumallee', 'Vater'); INSERT INTO mitglieder VALUES ('Hansen', 'Udo', 'Baumallee', 'Sohn'); INSERT INTO mitglieder VALUES ('Hansen', 'Sepp', 'Baumallee', 'Sohn'); INSERT INTO mitglieder VALUES ('Jahnke', 'Kurt', 'Dorfallee', 'Vater'); INSERT INTO mitglieder VALUES ('Volmer', 'Hans', 'Krausestr', 'Sohn'); INSERT INTO mitglieder VALUES ('Kuehne', 'Joern', 'Krausestr', 'Vater'); --========GMXBoundary91921006434238-- --- !!NEU!! Fragen und Antworten zu MySQL und dieser Liste unter -->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive