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 :

Problème de tri dans une requête SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Problème de tri dans une requête SQL
    Bonjour,


    je suis débutant en SQL (je travaille avec Dreamweaver, MAMP, InnoDB), et un peu gêné de venir poser ma question basique sur un forum de pros , mais je ne vois pas comment me sortir du problème dans lequel je me suis fourré.

    Voilà de quoi il s'agit:

    Sur plusieurs pages différentes, je veux afficher une liste de clients d'une région précise (ZIPs 1003, 1005, 1006, 1004, 1007, 1008, 1020, 1024, 1025, 1030, 1009, 1011, 1012, 1052, 1066, 1094, 1095, 1170, 1279, 1296, 1196, 1175, 1110, 1260, 1180, 1162, 1071, 1815, 1096, 1814, 1820, 1800, 1844, 1422, 1347, 1350, 1337, 1400, 1510, 1530, 1040, 1315, 1083, 1610, 1305, 1073, 1860, 1865, 1854), triés en fonction de formations postgrade et classés par zip ascendant et par ordre alphabétique.

    Chaque liste est différente sur chaque page.



    Voilà la requête type (qui fonctionnait jusqu'à maintenant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM clients
    WHERE clients.zip IN (1003, 1005, 1006, 1004, 1007, 1008, 1020, 1024, 1025, 1030, 1009, 1011, 1012, 1052, 1066, 1094, 1095, 1170, 1279, 1296, 1196, 1175, 1110, 1260, 1180, 1162, 1071, 1815, 1096, 1814, 1820, 1800, 1844,  1422, 1347, 1350, 1337, 1400, 1510, 1530, 1040, 1315, 1083, 1610, 1305, 1073,  1860, 1865, 1854)  AND clients.num_postgr1 = 1 OR clients.num_postgr2 = 1
    ORDER BY clients.zip, clients.alpha
    Tant que je n'ai eu que les zip ci-dessus dans ma table clients, tout s'est bien passé. Mais depuis que j'en ai introduit d'autres (1201, 1205, 1206, 1207 etc.), ça déraille - selon les pages, le tri en fonction des zip est correct, et dans d'autres le tri ne se fait pas.

    Exemples de ce qui se passe:

    Cette requête SQL donne le résultat voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM clients
    WHERE clients.zip IN (1003, 1005, 1006, 1004, 1007, 1008, 1020, 1024, 1025, 1030, 1009, 1011, 1012, 1052, 1066, 1094, 1095, 1170, 1279, 1296, 1196, 1175, 1110, 1260, 1180, 1162, 1071, 1815, 1096, 1814, 1820, 1800, 1844,  1422, 1347, 1350, 1337, 1400, 1510, 1530, 1040, 1315, 1083, 1610, 1305, 1073,  1860, 1865, 1854)  AND clients.num_postgr1 = 1 OR clients.num_postgr2 = 1
    ORDER BY clients.zip, clients.alpha
    Affichage des 20 clients qui correspondent, les 9 autres (zip 1201, 1205, 1206 et.) n'apparaissent pas dans le résultat.

    Par contre, cette requête (identique) ne fonctionne pas bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM clients
    WHERE clients.zip IN (1003, 1005, 1006, 1004, 1007, 1008, 1020, 1024, 1025, 1030, 1009, 1011, 1012, 1052, 1066, 1094, 1095, 1170, 1279, 1296, 1196, 1175, 1110, 1260, 1180, 1162, 1071, 1815, 1096, 1814, 1820, 1800, 1844,  1422, 1347, 1350, 1337, 1400, 1510, 1530, 1040, 1315, 1083, 1610, 1305, 1073,  1860, 1865, 1854)  AND clients.num_postgr1 = 3 OR clients.num_postgr2 = 3
    ORDER BY clients.zip, clients.alpha
    Affichage des 2 clients qui correspondent, plus un autre (zip 1206) qui n'a rien à faire là.

    J'ai essayé différents bidouillages, p. ex entrer exclusivement les zip concernés - rien n'y fait. Ou introduire un critère de tri supplémentaire par canton, nada...


    Je baise (virtuellement) les pieds de celui qui m'aidera à me sortir de cette panade!


    Dominique

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    À mon avis le problème vient de votre OR, vous n'avez pas mis de parenthèse.
    Vous avez écrit : cond1 AND cond2 OR cond3.
    Avec les règles de priorité, vous avez en réalité écrit ceci : (cond1 AND cond2) OR cond3.
    J'imagine que vous vouliez écrire ceci : cond1 AND (cond2 OR cond3).

    Il faut donc utiliser des parenthèses, ou alors l'opérateur IN quand c'est possible :
    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
      SELECT *
        FROM clients
       WHERE zip IN (1003, 1005, 1006, 1004, 1007, 1008, 1020, 1024, 1025, 1030,
                     1009, 1011, 1012, 1052, 1066, 1094, 1095, 1170, 1279, 1296,
                     1196, 1175, 1110, 1260, 1180, 1162, 1071, 1815, 1096, 1814,
                     1820, 1800, 1844, 1422, 1347, 1350, 1337, 1400, 1510, 1530,
                     1040, 1315, 1083, 1610, 1305, 1073, 1860, 1865, 1854)
         AND (num_postgr1 = 3 OR num_postgr2 = 3)
    ORDER BY zip, alpha;
     
      SELECT *
        FROM clients
       WHERE zip IN (1003, 1005, 1006, 1004, 1007, 1008, 1020, 1024, 1025, 1030,
                     1009, 1011, 1012, 1052, 1066, 1094, 1095, 1170, 1279, 1296,
                     1196, 1175, 1110, 1260, 1180, 1162, 1071, 1815, 1096, 1814,
                     1820, 1800, 1844, 1422, 1347, 1350, 1337, 1400, 1510, 1530,
                     1040, 1315, 1083, 1610, 1305, 1073, 1860, 1865, 1854)
         AND 3 in (num_postgr1, num_postgr2)
    ORDER BY zip, alpha

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut wouaouh la rapidité!
    Merci merci merci - je vais tester ça et vous redis!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut voilà
    tout fonctionne nickel, encore merci !

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

Discussions similaires

  1. Problème de variable dans une requête SQL
    Par Namzicos dans le forum SQL
    Réponses: 2
    Dernier message: 27/01/2010, 14h38
  2. Problème de variable dans une Requête SQl
    Par steph77 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 28/08/2009, 15h16
  3. Problème d'espaces dans une requête SQL
    Par Wonesek dans le forum SQL
    Réponses: 9
    Dernier message: 22/04/2008, 16h46
  4. Problème de cumul dans une requête SQL
    Par soso78 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 13/09/2007, 05h56
  5. Problème avec like dans une requête SQL
    Par Boublou dans le forum SQL
    Réponses: 2
    Dernier message: 16/08/2007, 15h46

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