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?