par
Hubert Roksor » 17 oct. 2007, 23:19
Pour résumer il s'agit d'un loto c'est bien ça ? Pour commencer, il te faut un schéma SQL qui tient la route :
- une table grilles pour enregistrer le bulletin de jeu de chaque joueur, sans oublier le tirage pour lequel le joueur jour,
- une table grille_numeros pour enregistrer chaque numéro joué dans chaque grille
- une table tirages pour enregistrer les tirages et la date à laquelle ils se sont déroulés
- une table tirage_numeros pour enregistrer chaque numéro tiré à chaque tirage
Je ne le précise pas, mais j'imagine que tu as déjà une tables
joueurs pour enregistrer tes joueurs. Ce schéma est naturellement extensible, peu importe si un tirage a 4 ou 6 numéros, peu importe si une grille a 4, 5 ou 12 numéros. Il te faudra gérer ces contraintes au niveau de PHP.
Code : Tout sélectionner
CREATE TABLE grilles (
grille_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
tirage_id mediumint(8) unsigned NOT NULL,
joueur_id mediumint(8) unsigned NOT NULL,
PRIMARY KEY (grille_id),
KEY joueur_id (joueur_id),
KEY tirage_id (tirage_id)
);
CREATE TABLE grille_numeros (
grille_id mediumint(8) unsigned NOT NULL,
numero tinyint(3) unsigned NOT NULL,
KEY grille_id (grille_id)
);
CREATE TABLE tirages (
tirage_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
tirage_date date NOT NULL,
PRIMARY KEY (tirage_id),
KEY tirage_date (tirage_date)
);
CREATE TABLE tirage_numeros (
tirage_id mediumint(8) unsigned NOT NULL,
numero tinyint(3) unsigned NOT NULL,
KEY tirage_id (tirage_id)
);
Reste la requête qui calcule le nombre de gagnants pour un tirage donné. Pour cela, on prend la liste des numéros tirés dans
tirage_numéros et les grilles jouées dans
grilles le tout grâce à
tirage_id, et on compte tous les enregistrements dans
grille_numeros correspondant à
(tirage_id,numero). On groupe le total par grille avec GROUP BY et on ne garde que ceux ayant 3 bons numéros ou plus grâce à HAVING.
Code : Tout sélectionner
SELECT gn.grille_id, COUNT(*) AS cnt
FROM (grilles g, tirage_numeros tn)
JOIN grille_numeros gn USING (grille_id, numero)
WHERE g.tirage_id = 1
AND tn.tirage_id = 1
GROUP BY g.grille_id
HAVING cnt >= 3
Résultat : on a la liste des grilles ayant plus de
n numéros justes. À toi ensuite de voir à quels joueurs elles correspondent, ou en faire ce que tu veux.
C'est plutôt rapide et ça devrait tenir le coup pour quelques milliers de grilles par tirage.
Pour info, les données que j'ai utlisé pour tester :
Code : Tout sélectionner
INSERT INTO grilles VALUES (1, 1, 1), (2, 1, 2), (3, 1, 3), (4, 1, 4), (5, 1, 2);
INSERT INTO grille_numeros VALUES (1, 0), (1, 11), (1, 22), (1, 33), (2, 44), (2, 22), (2, 11), (2, 77), (3, 44), (3, 22), (3, 77), (3, 55), (4, 0), (4, 99), (4, 66), (4, 33), (5, 33), (5, 44), (5, 66), (5, 99);
INSERT INTO tirage_numeros VALUES (1, 0), (1, 33), (1, 66), (1, 99);
Pour résumer il s'agit d'un loto c'est bien ça ? Pour commencer, il te faut un schéma SQL qui tient la route :
[list=1][*]une table [b]grilles[/b] pour enregistrer le bulletin de jeu de chaque joueur, sans oublier le tirage pour lequel le joueur jour,
[*]une table [b]grille_numeros[/b] pour enregistrer chaque numéro joué dans chaque grille
[*]une table [b]tirages[/b] pour enregistrer les tirages et la date à laquelle ils se sont déroulés
[*]une table [b]tirage_numeros[/b] pour enregistrer chaque numéro tiré à chaque tirage[/list]
Je ne le précise pas, mais j'imagine que tu as déjà une tables [b]joueurs[/b] pour enregistrer tes joueurs. Ce schéma est naturellement extensible, peu importe si un tirage a 4 ou 6 numéros, peu importe si une grille a 4, 5 ou 12 numéros. Il te faudra gérer ces contraintes au niveau de PHP.
[code]CREATE TABLE grilles (
grille_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
tirage_id mediumint(8) unsigned NOT NULL,
joueur_id mediumint(8) unsigned NOT NULL,
PRIMARY KEY (grille_id),
KEY joueur_id (joueur_id),
KEY tirage_id (tirage_id)
);
CREATE TABLE grille_numeros (
grille_id mediumint(8) unsigned NOT NULL,
numero tinyint(3) unsigned NOT NULL,
KEY grille_id (grille_id)
);
CREATE TABLE tirages (
tirage_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
tirage_date date NOT NULL,
PRIMARY KEY (tirage_id),
KEY tirage_date (tirage_date)
);
CREATE TABLE tirage_numeros (
tirage_id mediumint(8) unsigned NOT NULL,
numero tinyint(3) unsigned NOT NULL,
KEY tirage_id (tirage_id)
);[/code]
Reste la requête qui calcule le nombre de gagnants pour un tirage donné. Pour cela, on prend la liste des numéros tirés dans [b]tirage_numéros[/b] et les grilles jouées dans [b]grilles[/b] le tout grâce à [b]tirage_id[/b], et on compte tous les enregistrements dans [b]grille_numeros[/b] correspondant à [b](tirage_id,numero)[/b]. On groupe le total par grille avec GROUP BY et on ne garde que ceux ayant 3 bons numéros ou plus grâce à HAVING.
[code]SELECT gn.grille_id, COUNT(*) AS cnt
FROM (grilles g, tirage_numeros tn)
JOIN grille_numeros gn USING (grille_id, numero)
WHERE g.tirage_id = 1
AND tn.tirage_id = 1
GROUP BY g.grille_id
HAVING cnt >= 3[/code]
Résultat : on a la liste des grilles ayant plus de [i]n[/i] numéros justes. À toi ensuite de voir à quels joueurs elles correspondent, ou en faire ce que tu veux.
C'est plutôt rapide et ça devrait tenir le coup pour quelques milliers de grilles par tirage.
Pour info, les données que j'ai utlisé pour tester :
[code]INSERT INTO grilles VALUES (1, 1, 1), (2, 1, 2), (3, 1, 3), (4, 1, 4), (5, 1, 2);
INSERT INTO grille_numeros VALUES (1, 0), (1, 11), (1, 22), (1, 33), (2, 44), (2, 22), (2, 11), (2, 77), (3, 44), (3, 22), (3, 77), (3, 55), (4, 0), (4, 99), (4, 66), (4, 33), (5, 33), (5, 44), (5, 66), (5, 99);
INSERT INTO tirage_numeros VALUES (1, 0), (1, 33), (1, 66), (1, 99);[/code]