IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requète pour stats de jeu


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Requète pour stats de jeu
    Bonjour,
    Tout d'abord je suis désolé du titre qui n'est pas du tout explicite mais je ne voyais pas comment expliquer mon problème en bref.

    Après plusieurs essais, et n'étant pas un spécialiste du PHP ou du SQL, et ne trouvant aucune solution "pratique" à mon problème, je viens poser la question ici en espérant trouver mon bonheur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT char.name, global_reg_value.value AS tues, login.sex, char.class, morts.mort, (value / mort) AS ratio 
    FROM `char` INNER JOIN (SELECT char.char_id, global_reg_value.value AS mort
    FROM `char` INNER JOIN `global_reg_value` ON char.char_id=global_reg_value.char_id
    WHERE global_reg_value.str='PVPDeath') AS morts ON morts.char_id=char.char_id, `global_reg_value`, `login`
    WHERE char.char_id=global_reg_value.char_id AND char.account_id=login.account_id
    AND global_reg_value.str='PVPKill'
    ORDER BY ratio DESC
    LIMIT 0,5;
    Voici la requète, mes tables (enfin les infos dont vous avez besoin)

    dans char il y a char_id en clé primaire, et account_id en étrangères, et class comme champ.
    login : account_id en primaire, et sex en autre champ.
    global_reg_value : clé binaire char_id et str, value en autre champ.

    Si je peux expliquer le problème en pratique, cette requète est pour une page de stats d'un jeu. Elle devrait permettre d'afficher le nombre de kill et de morts par personne, et les classer par le ratio. Jusqu'ici pas de problème. Mais la variable est en fait créée dans la table global_reg_value, qu'on retrouve donc par char_id + str=PVPKill ou str=PVPDeath, seulement si la valeur est égale à 0, la variable est supprimée (ce n'est pas moi qui ait fait le serveur qui gère ceci), il n'y a donc plus de char_id+ str=PVPDeath, si le joueur n'est jamais mort. Ceci pose un gros problème, si le joueur a 30 kill mais aucune mort, ou l'inverse, il ne sera pas pris enc ompte par la requète. (Ca parait évident en fait , maintenant que je l'expose plus clairement)

    Sauriez vous de quelle manière je peux régler ce problème ? Je m'excuse d'avance du manque de clarté et de l'aspect de ma requète qui doit vous sembler barbare. Je ne suis pas un habitué du SQL. Si c'est résolvable par la partie php, ça m'irait très bien aussi. (je fais juste un while qui affiche la requète).

    Merci

    ~

  2. #2
    Membre du Club Avatar de Wiink
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    J'ai peut être rien compris, mais en fait la table global_reg_value est un grand fourre tout ? Si c'est le cas, la conception est mauvaise, et tu n'as pas fini d'en chier.

    Il serait bien plus pertinent de créer des champs pvpkill et pvdeath dans la table char.

    Au passage, nommer une table 'char' est déconseillé, c'est un type de donnée en SQL, il y a confusion .

  3. #3
    Membre éprouvé Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Points : 1 241
    Points
    1 241
    Par défaut
    bonjour,

    ton explication n'est pas tres claire (tu utilises le mot variable mais on ne sait pas trop ce que tu nommes),
    et je crois que ta requete SQL est mauvaise.

    si tu veux juste recuperer les valeurs des champs PVPDeath (qui doit donc être le nombre de morts : c.à.d le nombre de fois où le joueur est mort) et PVPKill (qui doit être le nombre de meurtres à l'actif du joueur), sachant que tu n'es pas sûr que ces champs existent, le plus simple est peut etre d'avoir une premiere requete qui recupere les joueurs.
    A partir de là (tu lis les resultats en PHP), tu fais une autre requete qui cherche PVPDeath pour le joueur en cours, et pareil pour PVPKill, tu peux alors tester en PHP que tes requetes te retournent quelque chose ou pas.

    Si tu veux t'en sortir avec une seule requete, c'est possible mais avec des OUTER JOIN au lieu de INNER, et bon courage.
    Tu peux t'adresser au forum SQL pour t'aider dans ce domaine en particulier

  4. #4
    Membre du Club Avatar de Wiink
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Il me semble que PVPDeath et PVPKill ne sont pas des champs, mais des valeurs de global_reg_value.str. La valeur de ce champs définie se que sera le champ lobal_reg_value.value. C'est donc pas récuperable avec une requette simple.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Pour le fait que ce soit un gros foutoir, oui c'est tout à fait vrai. C'est un serveur de jeu, et le jeu sauvegarde les variables de jeu (créées par les différents mécanismes du jeu) dans cette table global_reg_value, , et un script dit en gros à chaque fois qu'un joueur tue quelqu'un :
    UPDATE global_reg_value SET value=value+1 WHERE char_id='+id du personnage qui a tue+' AND str='PVPKill';
    Sauf que c'est pas ça puisque la ligne char_id ='X' AND str='PVPKill' n'existe qu'après le premier kill. Les variables ne sont sauvegardées dans la base de données mysql qu'à la déconnexion du personnage. Je pense que c'est fait pour éviter l'envoie continu de requète. En fait je pourrais rajouter des champs kill / death pour enlever le problème, comme vous en avez parler. Le problème est que j'ai peur que ça puisse faire ramer le serveur d'avoir des update en permanence sur ces champs, je ne me rends pas compte en réalité des limites d'un dédié.

    En tout cas je vous remercie pour vos réponses, je vais m'essayer aux OUTER JOIN voir si je peux arriver à quelque chose. Si ce n'est pas possible je me pencherai du côté d'une optimisation et un envoie simple de requète UPDATE à chaque kill plutôt qu'une utilisation du système de variable du jeu.

  6. #6
    Membre du Club Avatar de Wiink
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Le problème c'est pas la fréquence des update, mais l'endroit ou la valeur est stocké.

    Il devrais y avoir un champs PVPKill dans la table char, a zero par default, puis qui s'incrémente à chaque déconnections.

    Puis simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (`char`.PVPKill  / `char`.PVPDeath ) AS ratio FROM `char` ORDER BY ratio DESC

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    $frag = mysql_query("SELECT char.char_id, char.name, char.guild_id, global_reg_value.value AS tues, char.class, login.sex
    FROM `char` INNER JOIN global_reg_value ON char.char_id=global_reg_value.char_id INNER JOIN login ON login.account_id=char.account_id
    WHERE global_reg_value.str='PVPKill' AND char.guild_id<>176;") or die(mysql_error());
     
    //Requète PVPDeath
     
    $death= mysql_query("SELECT char.name, char.char_id, char.guild_id, char.class, login.sex, global_reg_value.value AS mort 
    FROM `char` INNER JOIN `login` ON char.account_id=login.account_id INNER JOIN global_reg_value ON char.char_id=global_reg_value.char_id 
    WHERE global_reg_value.str='PVPDeath' AND char.guild_id<>176;") or die(mysql_error());
     
     
    //Boucle remplissage avec infos + PVPKill
     
    			while ($pvpkill = mysql_fetch_array($frag)) {
     
    					$pvpstats[$pvpkill['char_id']]['nom'] = $pvpkill['name'];
    					$pvpstats[$pvpkill['char_id']]['guild_id'] = $pvpkill['guild_id'];
    					$pvpstats[$pvpkill['char_id']]['sex'] = $pvpkill['sex'];
    					$pvpstats[$pvpkill['char_id']]['class'] = $pvpkill['class'];
    					$pvpstats[$pvpkill['char_id']]['tues'] = $pvpkill['tues'];
     
    									  }
     
    //Boucle rajoutant PVPDeath à chaque ligne ayant des kills			
     
    			while ($pvpdeath = mysql_fetch_array($death)) {
    					$pvpstats[$pvpdeath['char_id']]['nom'] = $pvpdeath['name'];
    					$pvpstats[$pvpdeath['char_id']]['guild_id'] = $pvpdeath['guild_id'];
    					$pvpstats[$pvpdeath['char_id']]['sex'] = $pvpdeath['sex'];
    					$pvpstats[$pvpdeath['char_id']]['class'] = $pvpdeath['class'];
    					$pvpstats[$pvpdeath['char_id']]['mort'] = $pvpdeath['mort'];
    }
    J'me suis débrouillé comme ça, ça fonctionne, je vous remercie pour le temps passer à me répondre. (bon maintenant j'ai le soucis du classement à faire vu que c'est du tableau multidimensionnel, arsort fonctionne pas, ou en tout cas je trouve pas comment :/ mais bon c'est pas un soucis de sql)

Discussions similaires

  1. Requête pour des stats
    Par manzane dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/06/2007, 15h51
  2. [Conception] Requête sur des dates pour stats
    Par vallica dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2006, 10h15
  3. requête pour exclure les doublons.
    Par sam01 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2005, 19h10
  4. aide pour créer un jeu
    Par cstefany dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/10/2005, 03h51
  5. Réponses: 7
    Dernier message: 18/06/2003, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo