dedlfix: knifflige Verknüpfungsaufgabe - leider ohne Subselects

Beitrag lesen

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?