Vinzenz Mai: MySQL: <Problem nicht kompakt zusammenfassbar>

Beitrag lesen

Hallo Peter,

id | replaces_id | created    | ...
----+-------------+------------+- - -
  1 |        NULL | 2005-03-04 |
  2 |        NULL | 2003-08-22 |
  3 |           2 | 2006-05-05 |
  4 |           2 | 2006-05-05 |
  5 |           2 | 2006-06-06 |       <unzulässig!>
  6 |           3 | 2006-06-06 |

replaces_id soll also created bedingen, aber mehrere Werte von replaces_id sollen schon je einen anderen Wert von created zulassen.

Deine Tabellenstruktur scheint mir ungünstig gewählt, dies bedingt Dein Problem. Du solltest vielleicht genauer erläutern, welche Bedeutung die Spalte created hat, mir entzieht sich diese. Wenn replaces_id nicht NULL ist, so hängt created direkt von replaces_id ab, deswegen solltest Du dies in einer eigenen Tabelle aufführen.

Mein Vorschlag wären zwei Tabellen:

id  replaces_id  created
---------------------------
 1         NULL  2005-03-04
 2         NULL  2003-08-22
 3            2  NULL
 4            2  NULL
 5            2  NULL
 6            3  NULL

replaces_id  created
-----------------------
 2           2006-05-05
 3           2006-06-06

SELECT  
    id  
    t1.replaces_id  
    COALESCE(t1.created, t2.created) AS created  
FROM Tabelle1 t1  
LEFT JOIN Tabelle2 t2  
ON t1.replaces_id = t2.replaces_id

liefert Dir Deine Ausgangstabelle mit korrektem created-Wert für id=5.

Wenn Du MySQL 5.0 und höher verwendest, so kannst Du aus meiner Abfrage einen View erstellen, der genau das Aussehen Deiner Ausgangstabelle hat.

Da Du InnoDB verwendest, kannst Du mit einem FOREIGN KEY-Constraint Deine Bedingung durchsetzen, die CHECK-Klausel wird von MySQL derzeit noch komplett ignoriert ...

Freundliche Grüße

Vinzenz