Création d'un gagnant au hasard et d'afficher les chances de gagner - ce que je fais ce droit?
-
11-09-2019 - |
Question
Je suis en cours d'exécution d'un concours sur un site Web et je 3215 participants qui sont admissibles à 5x Sony PSP.
Je crois que la formule pour compter les cotes est totalEntrants - prix / prix:
(3215-5)/5 = 642
donc c'est une chance de 642-1 de gagner - est-ce pas? (Je suce en maths)
Et dans ma table qui contient 3215 lignes dans la base de données, je voudrais juste sélectionner une ligne au hasard comme ça?
SELECT * from entries
WHERE entries.won = 0
ORDER BY RAND()
LIMIT 1
Maintenant, j'ai une ligne, et je dois mettre la colonne won
à 1
si le participant ne peut pas gagner à nouveau, puis exécutez à nouveau? Ceci est ma première fois faire si je veux juste confirmation si je le fais correctement.
La solution
C'est vrai. Cinq personnes peuvent gagner, il y a 3215 participants, de sorte que les chances de gagner sont 3215 ÷ 5 qui est de 1 à 643, ou 642 à 1. 1 dans tous les 643 victoires qui signifie il y a 642 perdants à tous les 1 gagnant. Notez la différence subtile unique entre « x au hasard y » par rapport à « x à y hasard ».
Votre méthode de sélection a l'air bien. Vous pouvez aussi les sélectionner à la fois en changeant à LIMIT 5
.
Autres conseils
Pourquoi ne pas simplement utiliser LIMIT 5
pour sélectionner les gagnants en une seule étape?
chance de gain est totalEntrants / prix
Il n'y a pas besoin de réduire le nombre de prix. par exemple, si nous avons 2 participants et un prix sont les chances 2/1, qui signifie que chaque participant a l'une des deux chances de gagner (si nous avions réduit le nombre de prix qu'il va être 1/1, ce qui signifie une à une chance - vous gagner ...)
La requête semble droite:
- participant même ne sera pas sélectionné deux fois (En supposant que vous avez du code qui met à jour 'gagné' champ)
- L'utilisateur sera choisi au hasard par RANDOM générer un ordre différent à chaque fois que l'interrogation
Je pense que vous ne pouvez pas sélectionner et mettre à jour dans la même requête. Ce que je voudrais faire est d'utiliser votre requête pour sélectionner un gagnant au hasard et d'exécuter une mise à jour sur le registre dont l'ID a été retourné pour modifier le champ « gagné » d'avoir la valeur 1. Ensuite, vous répéter le processus 4 fois. :)
Utilisation:
CREATE TEMPORARY TABLE won LIKE ENTRIES;
DECLARE numAwards INT DEFAULT 5;
WHILE numAwards > 0 DO
INSERT INTO won
(columns...)
SELECT e.*
FROM ENTRIES e
WHERE e.userid NOT IN (SELECT w.userid FROM won)
ORDER BY RAND()
LIMIT 1;
SET numAwards = numAwards - 1;
END WHILE;
Vous pouvez également utiliser:
SELECT e.*
FROM ENTRIES e
LEFT JOIN won w ON w.userid = e.userid
WHERE w.userid IS NULL
ORDER BY RAND()
LIMIT 1;
... mais il n'y a pas de différence dans la performance - voir: pas vs. pas EXISTE contre LEFT JOIN / IS nULL: MySQL
UPDATE :. L'utilisation LIMIT 5
n'est pas idéale, car elle ne garantit pas qu'une personne gagnera une seule fois, à moins que vous assumez qu'une seule personne est entré une fois (peu probable)