3 Stimmen

Zwischenspeichern von Zeilenrängen in MySQL?

Ich habe eine Spalte, nach der ich sortieren möchte, mit regelmäßigen Aktualisierungen des Rangs (täglich). Ich verwende derzeit folgenden Code

get all rows from table order by column

rank = 1
foreach row in table
   update row's rank to rank
   rank++

Dies erfordert eine Aktualisierung für jede Zeile in MySQL. Gibt es effizientere Möglichkeiten, dies zu tun?

4voto

jspcal Punkte 49141

Verwenden Sie eine Aktualisierung mit einer Verknüpfung:

set @rank := 0;

update tbl a join
  (select id, @rank := @rank + 1 as new_rank from tbl order by col) b
  on a.id = b.id set a.rank = b.new_rank;

Wenn Sie mit vielen Zeilen rechnen, erzielen Sie die beste Leistung, wenn Sie die Verknüpfung mit einer Tabelle durchführen, die indiziert ist, z. B.:

set @rank := 0;

create temporary table tmp (id int primary key, rank int)
  select id, @rank := @rank + 1 as rank from tbl order by col;

update tbl join tmp on tbl.id = tmp.id set tbl.rank = tmp.rank;

Schließlich könnten Sie die Aktualisierung auch ganz überspringen und eine neue Tabelle einfügen (was nicht immer machbar ist):

set @rank := 0;

create table new_tbl (id int primary key, rank int, col char(10),
  col2 char(20)) select id, @rank := @rank + 1 as rank, col, col2
  from tbl order by col;

drop table tbl;
rename table new_tbl to tbl;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X