Guten Morgen!
Gegeben seien drei Tabellen einer MySQL 4.0-Datenbank:
+-------+ +------------------+ +---------------+
|Persons| |Connections | |ConnectionTypes|
+-------+ +------------------+ +---------------+
|ID |-+ |ID | +-|ID |
|Name | +-|ID_Persons | | |Name |
|... | |ID_ConnectionTypes|-+ +---------------+
+-------+ |Value |
|... |
+------------------+
ConnectionTypes enthält in Name beispielsweise Werte wie Phone, Fax, Email.
Ziel ist es Persons.*, Connections.Value AS Telefon, Connections.Value AS Fax zu erhalten. Weiterhin soll die Ergebnismenge zählbar, limitierbar und einschränkbar sein. (Wie das geht ist mir klar, es sollte nur bei der Lösung berücksichtigt werden.)
Pro Person und ConnectionType gibt es höchstens einen Datensatz (das wird durch eine entsprechende Bedingung sichergestellt).
Für Copy&Paste gibt es hier die CREATEs und ein paar Daten:
CREATE TABLE ConnectionTypes
(ID
int(11), Name
varchar(20), PRIMARY KEY(ID
));
CREATE TABLE Connections
(ID
int(11), ID\_Persons
int(11), ID\_ConnectionTypes
int(11), Value
varchar(50), PRIMARY KEY(ID
));
CREATE TABLE Persons
(ID
int(11), Name
varchar(50), PRIMARY KEY(ID
));
INSERT INTO Persons
VALUES (1,'Person1'),(2,'Person2'),(3,'Person3');
INSERT INTO ConnectionTypes
VALUES (1,'Telefon'),(2,'Fax'),(3,'Email');
INSERT INTO Connections
VALUES (1,1,1,'0815-4711'),(2,1,2,'0815-4712'),(3,2,1,'0815-4721'),(4,2,2,'0815-4722'),(5,3,1,'0815-4731');
Mein bester bisheriger Versuch sieht so aus:
SELECT Persons
.*, ConnectionsPhone
.Value
AS 'Telefon', ConnectionsFax
.Value
AS 'Fax'
FROM Persons
LEFT JOIN Connections
AS ConnectionsPhone
ON Persons
.ID
= ConnectionsPhone
.ID\_Persons
JOIN ConnectionTypes
AS ConnectionTypesPhone
ON ConnectionsPhone
.ID\_ConnectionTypes
= ConnectionTypesPhone
.ID
AND ConnectionTypesPhone
.Name
= 'Telefon'
LEFT JOIN Connections
AS ConnectionsFax
ON Persons
.ID
= ConnectionsFax
.ID\_Persons
JOIN ConnectionTypes
AS ConnectionTypesFax
ON ConnectionsFax
.ID\_ConnectionTypes
= ConnectionTypesFax
.ID
AND ConnectionTypesFax
.Name
= 'Fax';
Das klappt soweit, jedoch gibt es keine Datensätze, wenn die Person beispielsweise kein Fax hat (Person3).
War das jetzt knifflig genug? :-)
Wie gehts besser?