PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails:Der Aufruf von .limit(5) ändert die Reihenfolge der Ergebnisse

Angenommen, Sie versuchen, dieses Array von Arrays nach dem ersten Element zu ordnen:

[
  [ 1, 1 ],
  [ 1, 2 ],
  [ 1, 3 ]
]

Beides (und mehrere andere) sind gültige Ergebnisse, da Sie doppelte Sortierschlüssel haben:

[ [1,1], [1,2], [1,3] ]
[ [1,3], [1,1], [1,2] ]

Sie haben das gleiche Problem in der Datenbank. Sie sagen das:

Diese fünf Werte können also in beliebiger Reihenfolge erscheinen und dennoch Ihre angegebene ORDER BY-Bedingung erfüllen. Sie müssen nicht einmal bei zwei Ausführungen derselben Abfrage in derselben Reihenfolge aus der Datenbank kommen.

Wenn Sie eine konsistente Sortierung wünschen, müssen Sie sicherstellen, dass jede Zeile in Ihrer Ergebnismenge einen eindeutigen Sortierschlüssel hat, damit Bindungen konsistent aufgelöst werden. Dies ist ActiveRecord, also haben Sie eine eindeutige id verfügbar, damit Sie diese verwenden können, um Ihre Bestellbindungen zu lösen:

result = Rom::Leaderboard.order('pvp_vs desc, win_percent desc, id').limit(200) 
# --------------------------------------------------------------^^

Dadurch erhalten Sie eine klar definierte und eindeutige Reihenfolge.