2009-07-13 15 views

Répondre

153
SELECT * FROM table 
ORDER BY NEWID() 
+43

Pour MySQL, utilisez' ORDER BY uuid() '. (... pour ceux qui arrivent sur cette page via une recherche générique, comme moi!) –

+1

Cela fonctionne, mais est incroyablement lent sur la table que je choisis (14M + lignes). Est-ce prévisible? AFAIK, la table est correctement indexée. –

+4

@John - Vous sélectionnez 14 millions d'enregistrements et de générer et de commander par un identifiant unique. Peut-être que vous êtes seulement après une seule rangée aléatoire? Dans ce cas, sélectionnez SELECT TOP 1 FROM table ORDER BY NEWID() –

18

C'est la solution la plus simple:

SELECT quote FROM quotes ORDER BY RAND() 

Bien qu'il ne soit pas le plus efficace. This one est une meilleure solution.

+10

Assez sûr qui ne fonctionne pas. Le RAND() dans la clause ORDER BY n'est calculé qu'une seule fois, donc vous obtenez un ordre naturel. Pour le tester, essayez ORDER BY RAND(), 1 et vous obtiendrez une liste de vos citations commandées par la première colonne (au moins dans SQL Server 2005). –

+0

Hm, je suis assez sûr que cela a fonctionné pour moi dans le passé, peut-être que cela dépend du produit que vous utilisez. –

+0

Il ne semble pas que cela fonctionne sur MS SQL. –

11

La méthode habituelle consiste à utiliser la fonction NEWID(), qui génère un GUID unique. Donc,

SELECT * FROM dbo.Foo ORDER BY NEWID(); 
+0

Le choix évident, la fonction RAND() ne fonctionne pas directement, mais voici une solution de contournement: http://weblogs.sqlteam.com/jeffs/archive/2004/11/22/2927.aspx – devstuff

+0

+1 cela fonctionne, mais Dave Barker était plus rapide :) –

0

Pour être efficace et aléatoire, il peut être préférable d'avoir deux requêtes différentes.

Quelque chose comme ...

SELECT table_id FROM table

Ensuite, dans la langue choisie, choisir un identifiant aléatoire, puis tirer les données de cette ligne.

SELECT * FROM table WHERE table_id = $ rand_id

Mais ce n'est pas vraiment une bonne idée si vous vous attendez à avoir beaucoup de lignes dans la table. Ce serait mieux si vous mettez une sorte de limite sur ce que vous choisissez au hasard. Pour les publications, choisissez peut-être aléatoirement parmi les articles publiés au cours de la dernière année.

1

Voici un exemple (source):

SET @randomId = Cast(((@maxValue + 1) - @minValue) * Rand() + @minValue AS tinyint); 
-1

C'est ce que vous avez besoin:

SELECT * FROM COMMANDE nom_table PAR RAND() LIMIT 1

+3

La question a été balisée SQL Server. Le RAND() ne fonctionne pas et la limite n'est pas reconnue, et la question ne demande pas de limiter les résultats à un seul enregistrement. – LarsTech

Questions connexes