2 Stimmen

Wie wählt man einen zufälligen Datensatz aus den größten N Datensätzen effizient aus (nicht mit Unterabfrage) in MySQL?

select .. from (
    Select ... from ... order by weight desc limit N
    ) order by rand() limit 1

Bei der obigen Variante muss jedes Mal eine temporäre Tabelle erstellt werden, was nicht effizient ist und daher nicht in Frage kommt.

Wie macht man es richtig?

1voto

Mark Wilkins Punkte 39992

Wenn ich das richtig verstehe, wollen Sie die Rth Zeile aus einer geordneten Ergebnismenge, bei der R ist eine Zufallszahl. Wenn ja, dann scheint die Option LIMIT mit zwei Parametern die richtige zu sein. Der erste Parameter könnte die Zufallszahl aus 1 to N :

SELECT ... order by weight desc limit R,1

Ich habe kein MySQL installiert, kann es also nicht testen. Ich weiß also nicht, ob R RAND() direkt verwenden kann oder ob es vorberechnet werden muss.

0voto

awgy Punkte 15996

Das sollten Sie sich ansehen:

http://akinas.com/pages/en/blog/mysql_random_row/

Es gibt mehrere Vorschläge, wie man dies umsetzen und gleichzeitig Tabellenscans vermeiden kann, z. B:

SELECT * FROM `table` WHERE id >= (
        SELECT FLOOR( MAX(id) * RAND()) FROM `table` 
    ) ORDER BY id LIMIT 1;

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