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

Langage SQL Discussion :

Optimiser une requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut Optimiser une requête
    Bonjour,

    j'ai une table departements avec 3 champs (id_dept, nom_dept, num_dept) et une table régions avec 3 champs (id_reg, nom_reg, depts).
    le champ depts correspond au N° de départements d'une région séparé par virgule.

    le but est d'afficher les régions et les départements correspondants.

    je suis de suite parti sur la sélection des régions pour créer une boucle ou je récupère à chaque fois les départements correspondants.

    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
    while($row = mysql_fetch_object($requete)) {
    	echo "<strong>".$row->nom_reg."</strong><br>";
     
    	$dpt = explode(",", $row->depts);
     
    	for($i=0; sizeof($dpt) > $i; $i++){
    		$requete1= mysql_query("select nom_dept from departements where num_dept = '".$dpt[$i]."'");
     
    		echo "<ul>";
    		while($row1 = mysql_fetch_object($requete1)) {
    			echo "<li>".$row1->nom_dept."</li>";
    		}
    		echo "</ul>";
    	}
    }
    existe il une autre solution pour obtenir une seule requete pour effectuer cela avec group by ou autre et surtout que ce soit plus rapide ?
    je suis sur 1 version mysql 4.0.x

    voi

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  rgn.nom_reg
        ,   dpt.nom_dept
    FROM    regions AS rgn
        INNER JOIN
            departements AS dpt
            ON  (',' || rgn.depts || ',') LIKE ('%,' || dpt.num_dept || ',%')
    Toutefois, tu aurais quelque chose de bien plus pratique en modifiant ta structure comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    region (id_reg, nom_reg)
    departement (id_dept, nom_dept, num_dept, id_reg)
    La requête serait alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  rgn.nom_reg
        ,   dpt.nom_dept
    FROM    regions AS rgn
        INNER JOIN
            departements AS dpt
            ON  rgn.id_reg = dpt.id_reg

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    La 1ère requete me retourne 2200 resultats car j'ai les 22 regions et le 1er departements puis les 22 regions et le 2ème departement ....

    il doit y avoir un probleme sur la jointure non ?

    Merci pour les réponses

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    j'ai modifié la base comme indiqué plus haut en rajoutant un champ id_reg dans la table departements.

    la requete suivante me retourne chaque region avec le 1er departement.
    il ne m'affiche pas tous les departements de chaque regions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT rgn.nom_reg, dpt.nom_dept, dpt.num_dept FROM regions AS rgn
    INNER JOIN departements AS dpt
    ON rgn.id_reg = dpt.id_reg
    GROUP BY dpt.id_reg
    que faudrait-il ajouter ?

    Merci.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    A quoi est censé servir le GROUP BY ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    C'était un test ?
    mais ça donne le même résultat sans.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Es-tu bien sûr de tes données ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    oui à 99%.

    voici les 2 tables :
    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
    CREATE TABLE `departements` (
      `id_dept` tinyint(3) NOT NULL auto_increment,
      `id_reg` tinyint(2) NOT NULL default '0',
      `nom_dept` varchar(30) NOT NULL default '',
      UNIQUE KEY `id_dept_2` (`id_dept`),
      KEY `id_reg` (`id_reg`)
    ) TYPE=MyISAM;
     
    CREATE TABLE `regions` (
      `id_reg` tinyint(2) NOT NULL auto_increment,
      `nom_reg` varchar(30) NOT NULL default '',
      `depts` varchar(30) NOT NULL default '',
      UNIQUE KEY `id_reg` (`id_reg`),
      KEY `id_reg_2` (`id_reg`)
    ) TYPE=MyISAM;
    le résultat me semble normal au vu de la requete.
    je ne boucle pas sur la region ?

    Merci encore pour les infos.

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Où est passé num_dept ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    il ne sert plus, c'est id_dept qui le remplace.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    en fait, le group by avait une incidence puisque je récupère bien tous les departements mais avec à chaque fois le nom de la région.
    il faut en fait que je gère l'affichage des regions.

    est-il possible dans la réquete de récupèrer une seule fois la region ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Points : 419
    Points
    419
    Par défaut
    Mais à quoi sert depts maintenant que tu as mis la clé étrangère dans ta table des départements ?

    Peux-tu nous montrer le contenu d'une ligne de chaque table ?

    Citation Envoyé par p_m_g Voir le message
    en fait, le group by avait une incidence puisque je récupère bien tous les departements mais avec à chaque fois le nom de la région.
    il faut en fait que je gère l'affichage des regions.

    est-il possible dans la réquete de récupèrer une seule fois la region ?
    En principe, le GROUP BY est associé avec un agrégat. Ici, tu ne peux pas éviter d'avoir le nom de la région associé à chaque département.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    depts n'existe plus.

    la requete fonctionne bien (ne pas mettre group by), elle me retourne le nom de la region et le nom du departement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT rgn.nom_reg, dpt.nom_dept, dpt.num_dept FROM regions AS rgn
    INNER JOIN departements AS dpt
    ON rgn.id_reg = dpt.id_reg ORDER BY rgn.nom_reg, dpt.nom_dept
    le but est d'afficher la region avec ses departements, mais j'ai a chaque coup la region.
    est-il possible dans la requete de recuperer une seule fois la region ?
    je vois qu'un traitement php, non ?

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    En effet, il s'agit là de cosmétique, qui n'est pas le but du langage SQL.
    C'est à l'application de se charger de la mise en forme des données.

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

Discussions similaires

  1. Optimiser une requête de "classement"
    Par Manu0086 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/03/2006, 19h47
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 10h41
  3. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 12h31
  4. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 21h55

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