web-dev-qa-db-fra.com

Comment obtenir une plage d'entiers aléatoires mysql?

J'essaie de générer un entier aléatoire pour chaque ligne que je sélectionne entre 1 et 60 comme minuteur.

SELECT downloads.date, products.*, (FLOOR(1 + Rand() * 60)) AS timer

J'ai cherché et je continue à venir à cette fonction FLOOR pour savoir comment sélectionner un entier aléatoire dans une plage. Cela me donne un 1 pour chaque ligne . Qu'est-ce qui me manque?

Je suis sur mysql 5.0.75

Voici le reste de la requête, je crois que cela pourrait être un problème de nidification

SELECT *
FROM (
 SELECT downloads.date, products.*, FLOOR(1 + (Rand() * 60)) AS randomtimer, 
 (
 SELECT COUNT( * )
 FROM distros
 WHERE distros.product_id = products.product_id
 ) AS distro_count,

 (SELECT COUNT(*) FROM downloads WHERE downloads.product_id = products.product_id) AS true_downloads

 FROM downloads
 INNER JOIN products ON downloads.product_id = downloads.product_id
) AS count_table
WHERE count_table.distro_count > 0
AND count_table.active = 1
ORDER BY count_table.randomtimer , count_table.date DESC LIMIT 10
48
kevzettler

Cela fonctionne pour moi. Votre version de MySQL peut-être?

SELECT id, (FLOOR( 1 + Rand( ) *60 )) AS timer
FROM users
LIMIT 0 , 30
89
Ryan Oberoi

J'exécute votre requête et elle me donne un nombre aléatoire pour chaque ligne… peut-être que cela a quelque chose à voir avec le nom de l'aléatoire (timer)?

2
Jaime

La sortie de la fonction Rand sera toujours une valeur comprise entre 0 et 1 .

Essaye ça:

SELECT downloads.date, products.*, (CAST(Rand() * 60 AS UNSIGNED) + 1) AS timer
1
Chris Morley

Vous pouvez augmenter le nombre multiplié par le nombre d'enregistrements de la table.

SELECT id,

(FLOOR( (SELECT MIN(id)                        FROM  your_table ) + Rand( ) * 1000000 ) ) AS timer
FROM your_table
LIMIT 0 , 30
0