Tabelle: tab
Code:
UID | category | title | other | copyof
1 | a | asd | foo 0
2 | b | fgh | bar 0
3 | | jkl | 2
4 | c | yxc | qwe 0
5 | c | vbn | rtz 2
Eintrag 3 hat copyof = 2, d.h. er ist eine Kopie des zweiten Eintrags. Wenn er in einem Feld einen Eintrag hat (z.B. title), gilt dieser, sonst gilt der Eintrag der Zeile deren ID = 2 ist.
Meine Lösung ist jetzt in der Form:
SELECT uid, 0 as orig_id, category, NULL as orig_category, title, NULL as orig_title, other, NULL as orig_other FROM tab WHERE copyof = 0
UNION
SELECT copy.uid, orig.uid as orig_id, copy.category, orig.category as orig_category, copy.title, orig.title as orig_title, copy.other, orig.other as orig_other FROM tab AS orig, tab AS copy WHERE copy.copyof = orig.uid
Das liefert:
Code:
uid | orig_uid | category | orig_category | title | orig_title | other | orig_other
1 | 0 | a | NULL | asd | NULL | foo | NULL
2 | 0 | b | NULL | fgh | NULL | bar | NULL
4 | 0 | c | NULL | yxc | NULL | qwe | NULL
3 | 2 | | b | jkl | fgh | | bar
5 | 2 | c | b | jkl | fgh | rtz | bar
Nachteil: die Statements werden ziemlich unübersichtlich. Wenn ich z.B nur Einträge mit Kategorie b haben will, sieht das so aus:
SELECT uid, 0 as orig_id, category, NULL as orig_category, title, NULL as orig_title, other, NULL as orig_other FROM tab WHERE copyof = 0 AND category = 'b'
UNION
SELECT copy.uid, orig.uid as orig_id, copy.category, orig.category as orig_category, copy.title, orig.title as orig_title, copy.other, orig.other as orig_other FROM tab AS orig, tab AS copy WHERE copy.copyof = orig.uid WHERE ((copy.category = '' AND orig.category = b) OR (copy.category = 'b'))
und liefert:
Code:
uid | orig_uid | category | orig_category | title | orig_title | other | orig_other
2 | 0 | b | NULL | fgh | NULL | bar | NULL
3 | 2 | | b | jkl | fgh | | bar
Wenn es also eine bessere Methode gibt freue ich mich, ansonsten kann ich auch mit der aktuellen Methode leben.
jak