A
Anjacom
Gast
Ich habe Datensätze wie folgt:
item_id, item_date
int, timestamp int
Um es anschaulicher zu machen, nehme ich Wochentage anstelle des Timestamps und setze die Position vorne dran mit #
Die Sortierung ist item_date ASC, item_id ASC
Zustand:
#1 - Montag - 12
#2 - Mittwoch - 22
#3 - Freitag - 10
Jetzt soll die item_id 10 an die zweite Stelle verschoben werden, also
Ändere item_date auf Dienstag, wo item_id = 10
Ergebnis
#1 - Montag - 12
#2 - Dienstag- 10
#3 - Mittwoch - 22
Problematisch wird es jetzt:
#1 - Montag - 12
#2 - Montag - 22
#3 - Freitag - 10
Ich kann die item_id 10 nicht an die Position zwei setzen ohne item_date der anderen Datensätze zu ändern.
Kein Problem, ich fange hinten an und sage
Für alle Datensätze, nehme den letzten und setze auf Sonntag.
Nehme den Datensatz davor und setze auf Freitag (jeweils ein Tag frei dazwischen)
usw.
Mal angenommen, dass ich 10.000 Datensätze habe und #8992 auf #4 setzen will.
Mal angenommen, ich habe das schon ziemlich oft gemacht, meine Timestamps könnten nahe beieinander liegen.
Was wäre die optimale Lösung, um das Datum neu zu verteilen?
Ich möchte jetzt nicht hinten anfangen und alle 10.000 Datensätze updaten.
Idee 1:
Gehe von Zielort, Position # soweit nach oben bis eine Position gefunden wird, wo der zeitliche Abstand groß genug ist, dass ich alle item_date dazwischen mit einem Abstand von 10 neu setzen kann.
Wie könnte so eine Query aussehen?
Finde die Zeile, wo der Wert item_date größer ist als die Anzahl der Zeilen zwischen #4 und x bei einer gewünschten Different von 10.
Kann man das umsetzen?
Hmmm, da ich die Position auch als Feld habe:
Zeitdifferenz_notwendig = (Position_gesucht - Position_ Ziel) * 10
Zeitdifferenz_ist = (date_gesucht - date_ Ziel)
Select from table where {Zeitdifferenz} and {Zeitdifferenz_ist}
select from table
where position = (position - 4) AND date = (position-4)*10
Geht das in mysql?
Oder muss ichj via php solange durchlaufen bis ich eine passende Zeile finde?
Idee 2:
Schaue nach #4 und #5, ist da Platz dazwischen?
Dann schiebe #8992 nach #4 mit einem item_date = Hälfte des Abstandes von #4 und #5 alt.
Sind #4 und #5 gleich, dann erhöhe item_date von #5 um 10, schiebe die #8992 wieder zwischen #4 und #5 alt,
prüfe nun die #6, ist item_date von #6 > item_date von #5?
Wenn nein, erhöhe item_date von #6
Mache das solange bis es passt und item_date von x > item_date von x-1
Das kann ich umsetzen; schlimmstenfalls (aber eher nur theorethisch) muss ich alle Zeilen durchlaufen, habe dann aber wesentlich mehr Abfragen als bei einer Lösung, die item_date gleich neu setzt.
Das wäre dann Idee 3, nämlich setze einfach alle Zeilen passend neu.
Sollte man stattdessen alle paar Tage mal nachts einen cron-job laufen lassen, der eine ganze Liste zeitlich neu setzt, so dass man immer Platz zum Schieben hat?
Das Problem ist wie es ist, es muss mit den Vorgaben gelöst werden.
Ich hoffe, dass das nur eine kleine Fingerübung für jemanden ist, mir fallen so weit keine besseren Lösungen ein.
item_id, item_date
int, timestamp int
Um es anschaulicher zu machen, nehme ich Wochentage anstelle des Timestamps und setze die Position vorne dran mit #
Die Sortierung ist item_date ASC, item_id ASC
Zustand:
#1 - Montag - 12
#2 - Mittwoch - 22
#3 - Freitag - 10
Jetzt soll die item_id 10 an die zweite Stelle verschoben werden, also
Ändere item_date auf Dienstag, wo item_id = 10
Ergebnis
#1 - Montag - 12
#2 - Dienstag- 10
#3 - Mittwoch - 22
Problematisch wird es jetzt:
#1 - Montag - 12
#2 - Montag - 22
#3 - Freitag - 10
Ich kann die item_id 10 nicht an die Position zwei setzen ohne item_date der anderen Datensätze zu ändern.
Kein Problem, ich fange hinten an und sage
Für alle Datensätze, nehme den letzten und setze auf Sonntag.
Nehme den Datensatz davor und setze auf Freitag (jeweils ein Tag frei dazwischen)
usw.
Mal angenommen, dass ich 10.000 Datensätze habe und #8992 auf #4 setzen will.
Mal angenommen, ich habe das schon ziemlich oft gemacht, meine Timestamps könnten nahe beieinander liegen.
Was wäre die optimale Lösung, um das Datum neu zu verteilen?
Ich möchte jetzt nicht hinten anfangen und alle 10.000 Datensätze updaten.
Idee 1:
Gehe von Zielort, Position # soweit nach oben bis eine Position gefunden wird, wo der zeitliche Abstand groß genug ist, dass ich alle item_date dazwischen mit einem Abstand von 10 neu setzen kann.
Wie könnte so eine Query aussehen?
Finde die Zeile, wo der Wert item_date größer ist als die Anzahl der Zeilen zwischen #4 und x bei einer gewünschten Different von 10.
Kann man das umsetzen?
Hmmm, da ich die Position auch als Feld habe:
Zeitdifferenz_notwendig = (Position_gesucht - Position_ Ziel) * 10
Zeitdifferenz_ist = (date_gesucht - date_ Ziel)
Select from table where {Zeitdifferenz} and {Zeitdifferenz_ist}
select from table
where position = (position - 4) AND date = (position-4)*10
Geht das in mysql?
Oder muss ichj via php solange durchlaufen bis ich eine passende Zeile finde?
Idee 2:
Schaue nach #4 und #5, ist da Platz dazwischen?
Dann schiebe #8992 nach #4 mit einem item_date = Hälfte des Abstandes von #4 und #5 alt.
Sind #4 und #5 gleich, dann erhöhe item_date von #5 um 10, schiebe die #8992 wieder zwischen #4 und #5 alt,
prüfe nun die #6, ist item_date von #6 > item_date von #5?
Wenn nein, erhöhe item_date von #6
Mache das solange bis es passt und item_date von x > item_date von x-1
Das kann ich umsetzen; schlimmstenfalls (aber eher nur theorethisch) muss ich alle Zeilen durchlaufen, habe dann aber wesentlich mehr Abfragen als bei einer Lösung, die item_date gleich neu setzt.
Das wäre dann Idee 3, nämlich setze einfach alle Zeilen passend neu.
Sollte man stattdessen alle paar Tage mal nachts einen cron-job laufen lassen, der eine ganze Liste zeitlich neu setzt, so dass man immer Platz zum Schieben hat?
Das Problem ist wie es ist, es muss mit den Vorgaben gelöst werden.
Ich hoffe, dass das nur eine kleine Fingerübung für jemanden ist, mir fallen so weit keine besseren Lösungen ein.