Wenn Sie eine Kombination der Position und eines Zeitstempels verwenden, bei der der Benutzer einen Film an einer bestimmten Position ablegt und nicht versucht, die aktuelle Position beizubehalten, können Sie die Daten auf einfache Weise auswählen und aktualisieren. Beispielsweise; ein Basissatz von Daten:
create table usermovies (userid int, movieid int, position int, positionsetdatetime datetime)
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (123, 99, 1, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (123, 98, 2, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (123, 97, 3, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (123, 96, 4, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (123, 95, 5, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (123, 94, 6, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (987, 99, 1, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (987, 98, 2, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (987, 97, 3, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (987, 96, 4, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (987, 95, 5, getutcdate())
insert into usermovies (userid, movieid, position, positionsetdatetime)
values (987, 94, 6, getutcdate())
Wenn Sie die Benutzer-Filme mit einer Abfrage wie folgt abfragen:
;with usermovieswithrank as (
select userid
, movieid
, dense_rank() over (partition by userid order by position asc, positionsetdatetime desc) as movierank
from usermovies
)
select * from usermovieswithrank where userid=123 order by userid, movierank asc
Dann werden Sie das erwartete Ergebnis erhalten:
USERID MOVIEID MOVIERANK
123 99 1
123 98 2
123 97 3
123 96 4
123 95 5
123 94 6
bewegen eine der rankings der filme müssen wir die position und die positionssatzzeitspalten aktualisieren. Zum Beispiel, wenn Benutzer-ID 123 bewegt Film 95 von Rang 5 auf Rang 2 dann tun wir dies:
update usermovies set position=2, positionsetdatetime=getutcdate()
where userid=123 and movieid=95
, die in diesen Ergebnisse (oben im Anschluss an die Aktualisierung der SELECT-Abfrage):
USERID MOVIEID MOVIERANK
123 99 1
123 95 2
123 98 3
123 97 4
123 96 5
123 94 6
Dann wenn Benutzer-ID 123 bewegt Film 96-1 Rang:
update usermovies set position=1, positionsetdatetime=getutcdate()
where userid=123 and movieid=96
Wir erhalten:
USERID MOVIEID MOVIERANK
123 96 1
123 99 2
123 95 3
123 98 4
123 97 5
123 94 6
Natürlich werden Sie mit doppelten Positionsspaltenwerten in der usermovies-Tabelle enden, aber mit dieser Methode werden Sie diese Spalte nie anzeigen, Sie verwenden sie einfach zusammen mit positionsetdatetime, um einen sortierten Rang für jeden Benutzer und Rang zu bestimmen Sie bestimmen, ist die reale Position.
Wenn Sie möchten, dass die Positionsspalte die Filmrangfolgen ohne Bezug auf die positionsetdatetime korrekt wiedergibt, können Sie den movieRank aus der Auswahlabfrage oben verwenden, um den Spaltenwert der Spalte usermovies zu aktualisieren bestimmte Filmrankings.
und was wäre die SQL-Abfrage, um Filme aufzulisten? – bjan
@bjan Auswählen sollte ziemlich einfach sein ... Aktualisierung ist ein bisschen Tricker, aber ich denke, das funktioniert. – McGarnagle
Gemäß meinem Test, es ergibt sich doppelte Vorgeschichte !! – bjan