Enregistrements consécutifs sur un champs dans MYSQL

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par sureau, 17 Juin 2008.

  1. sureau
    sureau WRInaute discret
    Inscrit:
    7 Mars 2005
    Messages:
    157
    J'aime reçus:
    0
    Bonjour, pour un site de jeu en ligne ( voir le www ), j'aurais voulu ressortir des données du genre : nombre de victoires et défaites consécutives, nombre de coups parfait consécutif etc...
    Pour cela, j'ai une table ACTION qui enregistre tout ce qui se passe dans une partie.
    Pour synthétiser, elle contient comme champs
    1 - idDuJoueur
    2 - DateHeure de la partie
    3 - victoire (boolean true or false)

    idDuJoueur et la DateHeure constituent la clé primaire

    Donc nous pouvons avoir plusieurs parties d'un joueur le même jour et plusieurs parties à la même dateHeure, mais pas du même joueur.

    De qu'elle façon pourrais je ressortir le nombre d'enregistrements consécutifs où victoire est true (nombre de victoires d'affilées).

    Les joueurs jouant beaucoup (plusieurs centaines de parties pour de très nombreux joueurs (et en milliers pour les toxicos de la belote), je souhaiterais faire ce traitement directement sur mysql plutôt que de charger tous les enregistrements pour les retraiter ensuite.

    Avez vous une piste?
     
  2. Mitsu
    Mitsu WRInaute discret
    Inscrit:
    18 Décembre 2006
    Messages:
    239
    J'aime reçus:
    0
    Tu veux juste compter le nombre de victoire? je comprends pas le problème tu fait un
    SELECT COUNT(*) WHERE victoire=true
     
  3. sureau
    sureau WRInaute discret
    Inscrit:
    7 Mars 2005
    Messages:
    157
    J'aime reçus:
    0
    En fait je voudrais les victoires consécutives (2 d'affilées etc...), en gros le nombre maximum d'enregistrements ayant victoires=true successives sans victoires=false entre 2 enregistrements.
     
  4. ADIDASman
    ADIDASman WRInaute discret
    Inscrit:
    17 Avril 2004
    Messages:
    100
    J'aime reçus:
    0
    Si tu n'as pas peur des requêtes complexes, en voici une qui devrait fonctionner :

    Code:
    select plage.id_du_joueur, plage.defaite, plage.defaite_suivante, count(*) as victoires_consecutives
    from
    (
    (
    select id_du_joueur, '0001-01-01 00:00:00' as defaite, min(date_heure) as defaite_suivante
    from action
    where victoire = 0
    group by id_du_joueur, defaite
    )
    union
    (
    select a1.id_du_joueur, a1.date_heure as defaite, a2.date_heure as defaite_suivante
    from action as a1, action as a2
    where a1.id_du_joueur = a2.id_du_joueur
    and a1.victoire = 0
    and a2.victoire = 0
    and a2.date_heure = (
    select min(a3.date_heure) 
    from action as a3 
    where a3.id_du_joueur = a1.id_du_joueur 
    and a3.victoire = 0 
    and a3.date_heure > a1.date_heure)
    )
    union
    (
    select id_du_joueur, max(date_heure) as defaite, '9999-12-31 23:59:59' as defaite_suivante
    from action
    where victoire = 0
    group by id_du_joueur
    )
    ) plage,
    action
    where plage.id_du_joueur = action.id_du_joueur
    and plage.defaite < action.date_heure
    and plage.defaite_suivante > action.date_heure
    group by plage.id_du_joueur, plage.defaite, plage.defaite_suivante
    Ce n'est pas super facile à comprendre mais ce que tu veux faire n'est pas super simple non plus ;)

    Voici donc quelques explications...

    Tout d'abord, on construit une "table intermédiaire" que j'ai appelée ici plage. Elle contient les informations suivantes :

    id_du_joueur : l'identifiant du joueur
    defaite : la première défaite du joueur
    defaite_suivante : la défaite suivant la première

    Et ainsi de suite...

    Pourquoi est-elle constituée à l'aide d'UNION ?
    Tout simplement car il faut prendre en compte une éventuelle séquence de victoires en début ou en fin de "vie" d'un joueur !

    Le reste de la requête est relativement simple : on compte pour chaque "plage", le nombre de victoires correspondant.

    Enjoy :)

    Edit : Hors Sujet : Sympa le concept de ton site de belote en ligne !
     
  5. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 226
    J'aime reçus:
    0
    Utiliser la clause HAVING !
     
  6. ADIDASman
    ADIDASman WRInaute discret
    Inscrit:
    17 Avril 2004
    Messages:
    100
    J'aime reçus:
    0
    Il est en effet possible de placer quelques HAVING au lieu notamment des "where victoire = 0"...
    Je suis loin d'être un expert en benchmarks MySQL et je ne sais pas si les performances seront meilleures.
     
  7. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 021
    J'aime reçus:
    1
    et un aspro, t'a vu la requête :roll:
     
  8. sureau
    sureau WRInaute discret
    Inscrit:
    7 Mars 2005
    Messages:
    157
    J'aime reçus:
    0
    Ma fois, je pensais pas ça si complexe, mais je suis bluffé par la solution.

    La requête ne marche pas (forcemment sinon ça aurait été trop facile), et MYSQL retourne cette erreur : "Every derived table must have its own alias "

    J'ai remplacer les UNION par des UNION ALL mais toujours le même problème. Bref, le plus gros a été fait, je ne connaissais pas cette méthode que je trouve très bien pensé :) Reste plus qu'à débuguer.

    Un grand merci :)
     
  9. ADIDASman
    ADIDASman WRInaute discret
    Inscrit:
    17 Avril 2004
    Messages:
    100
    J'aime reçus:
    0
    Ah ben m*** alors...
    Etant donné que je trouvais le problème intéressant à résoudre, j'ai créé une table action ayant la même structure que la tienne pour faire des tests.
    La requête que je t'ai posté ci-dessus marche impeccable chez moi !
    Je ne me serais pas permis de le faire sans préciser la mention "non testée" si ça n'était pas le cas.

    Pour info, les tests ont été faits sur du MySQL 5.0.45.

    A priori, l'erreur que tu rencontres doit venir du fait que certaines tables n'ont pas été "aliasées".

    Tu peux essayer ceci qui fonctionne parfaitement chez moi (j'ai rajouté des as act3, as act4 et as act5) :

    Code:
    select plage.id_du_joueur, plage.defaite, plage.defaite_suivante, count(*) as victoires_consecutives
    from
    (
    (
    select act1.id_du_joueur, '0001-01-01 00:00:00' as defaite, min(act1.date_heure) as defaite_suivante
    from action as act1
    where act1.victoire = 0
    group by act1.id_du_joueur, defaite
    )
    union
    (
    select a1.id_du_joueur, a1.date_heure as defaite, a2.date_heure as defaite_suivante
    from action as a1, action as a2
    where a1.id_du_joueur = a2.id_du_joueur
    and a1.victoire = 0
    and a2.victoire = 0
    and a2.date_heure = (
    select min(a3.date_heure)
    from action as a3
    where a3.id_du_joueur = a1.id_du_joueur
    and a3.victoire = 0
    and a3.date_heure > a1.date_heure)
    )
    union
    (
    select act4.id_du_joueur, max(act4.date_heure) as defaite, '9999-12-31 23:59:59' as defaite_suivante
    from action as act4
    where act4.victoire = 0
    group by act4.id_du_joueur
    )
    ) plage,
    action as act5
    where plage.id_du_joueur = act5.id_du_joueur
    and plage.defaite < act5.date_heure
    and plage.defaite_suivante > act5.date_heure
    group by plage.id_du_joueur, plage.defaite, plage.defaite_suivante
    Bon courage et tiens nous au courant.
     
Chargement...
Similar Threads - Enregistrements consécutifs champs Forum Date
[MySQL] Nombre d'enregistrements sur des horaires précis Développement d'un site Web ou d'une appli mobile 19 Juillet 2013
Requetes SQL un peu lente ... ~1 million d'enregistrements Développement d'un site Web ou d'une appli mobile 4 Mars 2013
[résolu] [mysql] passer un champ à une valeur donnée pour tous les enregistrements Développement d'un site Web ou d'une appli mobile 25 Mars 2011
enregistrements MX et CNAME sous DNS Administration d'un site Web 12 Novembre 2010
style différent tous les 3 enregistrements sur une boucle php Développement d'un site Web ou d'une appli mobile 17 Septembre 2010
Questions sur les enregistrements PTR Noms de domaine et référencement 21 Juillet 2009
Nombre d'enregistrements du sitemap Crawl et indexation Google, sitemaps 15 Mai 2009
[RESOLU] affiche 20 enregistrements aléatoire en php Développement d'un site Web ou d'une appli mobile 13 Août 2008
Requête SQL inserer plusieurs enregistrements Développement d'un site Web ou d'une appli mobile 21 Mai 2008
Enregistrements non compris dans une jointure SQL Développement d'un site Web ou d'une appli mobile 30 Janvier 2008
MYSQL Inserer plusieurs enregistrements Développement d'un site Web ou d'une appli mobile 22 Janvier 2008
Plusieurs enregistrements même requête Développement d'un site Web ou d'une appli mobile 20 Janvier 2008
[PHP MYSQL] Affecter plusieurs enregistrements Développement d'un site Web ou d'une appli mobile 18 Décembre 2007
Problème MySQL : Nbre d'enregistrements Développement d'un site Web ou d'une appli mobile 28 Novembre 2007
Requete update sur plusieurs enregistrements simultanement Développement d'un site Web ou d'une appli mobile 15 Octobre 2007
Affichage enregistrements et update Développement d'un site Web ou d'une appli mobile 10 Août 2007
Comment concaténer deux enregistrements en un seul svp ? Administration d'un site Web 5 Juillet 2007
Combien d'enregistrements par jour Débuter en référencement 21 Juin 2007
Supprimer les enregistrements orphelins dans MySQL ? Administration d'un site Web 11 Avril 2007
[résolu] Afficher les enregistrements par groupes Développement d'un site Web ou d'une appli mobile 9 Mars 2007