50 Stimmen

MySQL ORDER BY rand(), name ASC

Ich möchte eine Datenbank mit sagen wir 1000 Benutzern nehmen und 20 zufällige Benutzer auswählen ( ORDER BY rand() , LIMIT 20 ) und ordnen Sie die Ergebnismenge nach den Namen. Ich kam mit der folgenden Abfrage, die ist no funktioniert, wie ich gehofft hatte.

SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20

71voto

Mark Byers Punkte 761508

Verwenden Sie eine Unterabfrage:

SELECT * FROM 
(
    SELECT * FROM users ORDER BY rand() LIMIT 20
) T1
ORDER BY name 

Die innere Abfrage wählt 20 Benutzer nach dem Zufallsprinzip aus und die äußere Abfrage ordnet die ausgewählten Benutzer nach Namen.

14voto

ircmaxell Punkte 159431

Vorsicht bei ORDER BY RAND() wegen der Leistung und der Ergebnisse. Sehen Sie sich diesen Artikel an: http://jan.kneschke.de/projects/mysql/order-by-rand/

10voto

Siqi Lin Punkte 1187

Anstatt eine Unterabfrage zu verwenden, könnten Sie zwei separate Abfragen verwenden, eine, um die Anzahl der Zeilen zu ermitteln, und die andere, um die zufälligen Zeilen auszuwählen.

SELECT COUNT(id) FROM users; #id is the primary key

Dann nimm eine zufällige Auswahl von zwanzig Reihen.

$start_row = mt_rand(0, $total_rows - 20);

Die letzte Abfrage:

SELECT * FROM users ORDER BY name ASC LIMIT $start_row, 20;

2voto

Quassnoi Punkte 396418
SELECT  *
FROM    (
        SELECT  *
        FROM    users
        WHERE   1
        ORDER BY
                rand()
        LIMIT 20
        ) q
ORDER BY
        name

2voto

Verwenden Sie eine Unterabfrage:

SELECT * FROM (
    SELECT * FROM users ORDER BY RAND() LIMIT 20
) u
ORDER BY name

oder eine Verbindung zu sich selbst:

SELECT * FROM users u1
INNER JOIN (
    SELECT id FROM users ORDER BY RAND() LIMIT 20
) u2 USING(id)
ORDER BY u1.name

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