phpbar.de logo

Mailinglisten-Archive

AW: AW: Joins auf die gleiche tabelle

AW: AW: Joins auf die gleiche tabelle

mysql-de_(at)_lists.bttr.org mysql-de_(at)_lists.bttr.org
Thu, 22 Nov 2001 14:03:58 +0100 (MET)


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