Partage
  • Partager sur Facebook
  • Partager sur Twitter

Doctrine requete qui dure, qui dure....

Sujet résolu
    13 janvier 2011 à 17:11:30

    Salut,

    Je viens de me faire une BDD géographique contenant les pays, les villes (principalement de france pour le moment), etc...

    Je fait une requete doctrine pour récupérer les villes selon une variable de trie (saisie dans un champ de texte)

    mon probléme c'est que la requete tourne en rond et lorsque je raffraichis la page, je suis déconnecté de la session :/

    a mon avis, les 42000 entrés des tables servant a la recherche doivent y etre pour quelquechose...

    Voici ma requete:

    <?php
    $aVilles = Doctrine_Query::create()
    			   ->select('
    				     c.Name,
    				     p.id,
    				     zc.zipcode
    				    ')
    			   ->from('City c')
    			   ->leftJoin('c.Zipcodes zc')
    			   ->where('c.country_id = ?', (isset($_GET['pays']) ? $_GET['pays'] : 1))
    			   ->andWhere('(c.Name LIKE ? OR zc.zipcode LIKE ?)', array('%'. $_GET['search'] .'%', $_GET['search'] .'%'))
    			   ->orderBy('c.Name')
    			   ->groupBy('c.id');
    
    $nbVilles = count($aVilles);
    
            $aVilles = $aVilles->limit(50)
    			   ->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
    ?>
    


    Si quelqu'un a une solution, ca serai cool :p
    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2011 à 17:51:25

      Quel est le SQL généré par cette requête ?
      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2011 à 18:13:57

        SELECT c.id AS c__id, c.name AS c__name, c2.id AS c2__id, c2.zipcode AS c2__zipcode 
        FROM city c LEFT JOIN city_zipcodes c2 ON c.id = c2.city_id 
        WHERE (c.country_id = ? AND (c.name LIKE ? OR c2.zipcode LIKE ?)) 
        GROUP BY c.id ORDER BY c.name
        


        Voila, c'est le resultat de getSqlQuery()
        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2011 à 18:17:06

          Au fait, pourquoi les codes postaux sont dans une table séparée ?

          Le GROUP BY est faux mais ce n'est pas ça qui fait ramer ta requête.

          Exécute EXPLAIN ta requête et poste le résultat.

          A quoi sert le count() ?
          • Partager sur Facebook
          • Partager sur Twitter
            13 janvier 2011 à 18:38:12

            J'ai séparé les codes postaux pour permettre d'avoir une seule ville liée a plusieurs codes postaux, par exemple j'ai une seule fois Paris dans ma table "cities" mais j'ai ses 22 codes postaux dans la table "city_zipcodes"

            le count sert a compter le nombre de villes trouvés par la requete (comme le résultat part dans un select, je limite le nombre de résultats a 50 et je marque "nombre de résultats: 50 / 3612"

            Resultat du EXPLAIN:

            d | select_type | table |type |	possible_keys | key  | key_len | ref  |	rows  |	Extra
            1 | SIMPLE 	| c 	|ALL  |	Name 	      | NULL | NULL    | NULL |	41404 |	Using where; Using temporary; Using filesort
            1 | SIMPLE 	| c2 	|ALL  |	NULL 	      | NULL | NULL    | NULL |	42629 |	Using where
            
            • Partager sur Facebook
            • Partager sur Twitter
              13 janvier 2011 à 18:45:15

              Tu as oublié des index... par exemple sur zipcodes( city_id )

              > le count sert a compter le nombre de villes trouvés par la requete

              Je me demande comment Doctrine implémente ça...
              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2011 à 18:52:48

                j'ai était surpris aussi pour le count quand je l'ai découvert mais ca marche nikel.

                En effet, j'avais pas mis d'index sur le city_id (d'habitude je fait générer mes tables par doctrine mais la j'ai du le faire a la main)...

                Peut tu m'expliquer le principe des index et des clés primaires (briévement, je veut pas t'embeter)
                vu que je suis autodidacte a 100% et que je me suis surtout concentré sur PHP j'ai pas mal de lacunes en SQL...
                • Partager sur Facebook
                • Partager sur Twitter
                  13 janvier 2011 à 18:56:26

                  Regarde dans les tutos du site, il y en a qui expliquent la conception de BDD, ça sera plus pratique.

                  Un index sur une colonne permet de retrouver rapidement les lignes de la table qui ont cette valeur. Quand tu fais une jointure, un index peut être utile. Avec MySQL (qui ne sait pas optimiser correctement un join) c'est même indispensable...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Doctrine requete qui dure, qui dure....

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown