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 :

Optimisation requête carte [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Points : 56
    Points
    56
    Par défaut Optimisation requête carte
    Bonjour,

    Je cherche a créer la requête la plus efficace possible pour le système suivant.

    C'est une carte de 20x20 où l'on peut déplacer des groupes (ici repris sous le nom de "mouvement" dans la BDD) (une armée par exemple), plusieurs groupes peuvent se retrouver sur la même case.

    La requête actuelle ne me permet d'afficher qu'un "mouvement" sur la case.

    Voici les tables :

    Code sql : 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
    CREATE TABLE IF NOT EXISTS `guerres_carte` (
      `id_case` int(9) unsigned NOT NULL,
      `x` smallint(2) unsigned NOT NULL,
      `y` smallint(2) unsigned NOT NULL,
      `carte` mediumint(7) unsigned NOT NULL,
      `type` tinyint(1) unsigned NOT NULL,
      KEY `x` (`x`,`y`,`carte`),
      KEY `id_case` (`id_case`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    CREATE TABLE IF NOT EXISTS `guerres_mouvements` (
      `id_mouvement` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `union_mouvement` smallint(5) unsigned NOT NULL,
      `type` tinyint(1) unsigned NOT NULL,
      `mouvement` text NOT NULL,
      `case_mouvement` int(9) unsigned NOT NULL,
      `carte` mediumint(7) unsigned NOT NULL,
      `joueur` mediumint(7) unsigned NOT NULL,
      `temps_fin` int(11) unsigned NOT NULL,
      `destination` int(9) unsigned NOT NULL,
      PRIMARY KEY (`id_mouvement`),
      KEY `union_mouvement` (`union_mouvement`,`case_mouvement`,`carte`),
      KEY `joueur` (`joueur`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

    Et le code :

    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
    <?php
     
    $selection_carte = $bdd->query('SELECT g_c.id_case,g_c.x,g_c.y,g_c.type,g_m.type AS type_mouvement, g_m.mouvement,g_m.temps_fin,g_m.destination FROM guerres_carte g_c
    LEFT JOIN guerres_mouvements g_m
    ON g_c.id_case=g_m.case_mouvement
    AND g_m.joueur='.$id_joueur.'
    WHERE g_c.carte='.$donnees_guerres['id_guerre'].' 
    ORDER BY g_c.id_case ASC');
     
    while($donnees_carte = $selection_carte->fetch())
    {
    	if($i%$donnees_guerres['x_max'] == 0 && $i > 0)
    		$carte .= '</tr><tr>';
     
    	$carte .= '<td class="dessous_carte">Case</a></td>';
    	//S'il y a un groupe sur la case, on affiche le nom sur la case
    	$i++;
    }
     
    ?>
    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et quelle est la question ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    La requête actuelle ne me permet d'afficher qu'un "mouvement" sur la case.
    J'aimerais pouvoir afficher tous les mouvements en cours sur une case.
    Sauf qu'avec la requête actuelle c'est impossible.

    Je pourrais faire une deuxième requête dans la première boucle pour tous les lister sur chaque case, mais j'aimerais éviter ce système (un peu gourmand sur une carte de 400 cases..).

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il n'y a rien dans la requête qui limite à un seul retour.
    Tu as vérifié ta requête dans phpmyadmin ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Effectivement, ça semble correct niveau phpMyAdmin, du coup ça doit plutôt être au niveau du script.

    Des images pour mieux comprendre :

    http://www.fatal-destiny.com/phpmyadmin.png
    http://www.fatal-destiny.com/carte.png

    Encadré en bleu : cela correspond à la case 157, qui s'affiche deux fois.

    Lorsque l'on survole une case, on a le détails du/des mouvements qui sont présents sur celles-ci.
    Il faudrait donc que la case ne s'affiche qu'une fois (c'est juste le contenu des détails qui change, mais il ne doit y avoir qu'une seule case quel que soit le nombre de mouvements).
    Encadré en rouge : du coup ça décale tout et on se retrouve avec une case seule en bas.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    tu peux simplement regarder si tu as changé de case ou non que tu parcoures tes mouvements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $previous_case = '';
    while($donnees_carte = $selection_carte->fetch())
       {
       if ($donness_carte['g_c.id_case'] == $previous_case) {
           // meme case
       }
       else{
          // nouvelle case
       }
     
       $previous_case = $donness_carte['g_c.id_case'];
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Il a fallu chipoter, mais ça fonctionne, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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