Help! Ich habe ein großes Problem
;)Erstmal auf Deutsch, was ich machen will ist: Personen sind in Gruppen, mehrere Personen in einer Gruppe und jede Person in mehreren Gruppen. In der Relationstabelle gibt es für diese Zugehörigkeiten immer einen Zeitraum. Nun wenn ich zwei Personen, die sich als doppelt oder mehrfach in der DB enthalten heraus stellen, miteinander zusammenführen will, muss ich natürlich von den Zugehörigkeitszeiträumen jeweils das Minimum und Maximum erhalten und in den Zielpersonsrelationen wieder vermerken. Aber dieses getrennt für jede Gruppe in der die Zielperson dann ist.
Und jetzt technisch: Also die Sache ist die, dass in einer mit der Zugehörigkeitstabelle verwandten anderen Tabelle Autorendaten zusammengeführt werden, also aus mehreren AuthorIDs eine ID wird. Dabei gibt es dann den Fall, dass viele Datumssätze betroffen sind, unter denen es aber auch verschiedene GroupIDs gibt. Es müssten nun nicht einfach nur die Zeiträume aus allen überhaupt betroffenen Datumssätzen vereinigt werden, sondern immer nur bündelweise diejenigen welche eine der betroffenen AuthorIDs haben, aber auch unter sich die selbe GroupID. Es kann ja sein, das Datumssätze mit einer der betroffenen AuthorIDs von sich aus unterschiedliche GroupIDs haben, die aber nach dem Zusammenführen der Autoren für die Ziel-AuthorID eins werden.
Na wenn das mal nicht ohne komplexe Schleifenkonstruktion oder ähnlichem geht ... ich sehe halt noch nicht wie man da am besten vor gehen kann und welche Erleichterungen man durch MYSQL dabei in Anspruch nehmen kann.
(falls noch was unklar ist, bitte einfach fragen) danke
ps: umgekehrt soll das auch funktionieren: denn die Gruppen sind, mit einem anderen Was-Typ, ebenfalls in der 'Personen'-Tabelle gespeichert. AuthorID und GroupID zeigen also auf Datensätze in der Personentabelle. Nun, es soll auch gehen, dass ich nicht Personen, sondern Gruppen zusammen führe...
...bisher habe ich das so gemacht:
$jane->query("UPDATE MEMBERS SET GroupID = $destid WHERE GroupID IN ($sourceids)");
$jane->query("UPDATE MEMBERS SET AuthorID = $destid WHERE AuthorID IN ($sourceids)");
$jane->query("DELETE FROM MEMBERS WHERE GroupID IN ($sourceids)"));
$jane->query("DELETE FROM MEMBERS WHERE AuthorID IN ($sourceids)");
Dabei werden aber die Zeträume nicht verwendet wie oben gewünscht.
Dieses hier ist vielleicht ein passabler Ansatz:
SELECT @minDate := MIN(`startDate`) FROM `table` WHERE `groupId` = 123 GROUP BY `groupId`;
SELECT @maxDate := MAX(`endDate`) FROM `table` WHERE `groupId` = 123 GROUP BY `groupId`;
UPDATE `table` SET `startDate` = @minDate, `endDate` = @maxDate` WHERE `id` = 321;
Es führt Autoren zusammen welche in der selben Gruppe sind und verwendet dabei die größte Zeitspanne.
@Neo123 ok, gut zu wissen ^^