2010-09-03 4 views
1
id  | name 
-------+------------------------------------- 
209096 | Pharmacy 
204200 | Eyecare Center 
185718 | Duffy PC 
214519 | Shopko 
162225 | Edward Jones 
7609 | Back In Action Chiropractic Center 

J'utilise select id, name from customer order by random()lignes sans enregistrements répéter

Il y a 6 dossiers que je veux juste que chaque fois que je requête, je vais obtenir une ligne unique à chaque fois pour six fois, puis il commence à nouveau de la première ou de la les enregistrements sont commandés chaque fois que le premier ne s'est pas répété

+0

Vous voulez sélectionner tous les ordres possibles du 6? Pouvez-vous clarifier votre question? –

+1

Si je suis, ce que vous voulez faire est essentiellement de former une liste aléatoire de tous les enregistrements et, chaque requête, obtenir les 6 prochains éléments de cette liste jusqu'à ce qu'il soit épuisé, puis recommencer depuis le début. Est-ce correct? –

+0

Si oui, je suggère d'utiliser une fonction de hachage, et de l'ordre par MD5 (CONCAT ('somesalt', id, name)). Le tri ne sera pas exactement aléatoire, mais il sera assez proche pour la plupart des buts, et ainsi vous pouvez utiliser LIMIT/OFFSET. (Vous devriez mentionner quelle base de données - MySQL, SQL Server, Oracle, Postgres, etc. - vous utilisez dans votre question.) –

Répondre

0

Cela vous donnera 6 rangées aléatoires à chaque fois. L'option Grouper permet d'assurer des lignes uniques si votre identifiant n'est pas une clé primaire unique, donc peut-être pas nécessaire - en fonction de la structure de votre table.

SELECT TOP 6 id, name, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 
FROM customer 
GROUP BY id,name 
ORDER BY [RandomNumber] 

Modifier: Désolé! N'a pas lu la question correctement. Bien que vous puissiez l'utiliser pour obtenir une rangée aléatoire à chaque fois :)

Si vous souhaitez obtenir spécifiquement les 6 rangées dans un ordre aléatoire 1 à la fois, vous devrez stocker la commande quelque part. Suggérez de créer une table temporaire et de la sélectionner à partir de là, ou si vous utilisez une page Web frontale, récupérez les 6 lignes et stockez-les dans un ensemble de données.

+0

J'ai compris. Je blaguais si je pouvais gérer cela via SQL plutôt que de faire une table temporaire et de faire quelques trucs de codage. – jawad

+0

Il y a TOUJOURS un moyen, pas nécessairement le meilleur :) Découvrez ma nouvelle réponse – JumpingJezza

0

Vous pouvez utiliser cette logique, "milisecond" partie de la date actuelle est en constante évolution. Nous avons une colonne id comme numérique. Donc, nous pouvons utiliser la fonction modulaire pour obtenir l'ordre aléatoire:

create table #data(id numeric(10), name varchar(20)) 
insert #data select 209096 , 'Pharmacy' 
insert #data select 204200 , 'Eyecare Center' 
insert #data select 185718 , 'Duffy PC' 
insert #data select 214519 , 'Shopko' 
insert #data select 162225 , 'Edward Jones' 
insert #data select 7609 , 'Back In Action Chiropractic Center' 

select * from #data order by id % (datepart(ms, getdate())) 
0

OK Peut-être qu'il y a une autre façon de le faire juste en SQL. Ajouter une nouvelle colonne BIT "sélectionnée". Certainement pas la façon la plus rapide/la meilleure performance de le faire.

DECLARE @id INT 
IF NOT EXISTS (SELECT TOP 1 id FROM customer WHERE selected = 0) 
BEGIN 
    UPDATE customer SET selected = 0 
END 

SELECT @id = id FROM 
(SELECT TOP 1 id, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 
FROM customer WHERE selected = 0 
ORDER BY [RandomNumber]) a 

UPDATE customer SET selected = 1 WHERE id = @id 
SELECT id, name FROM customer WHERE id = @id 
Questions connexes