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

Requêtes MySQL Discussion :

Cette requête est-elle valide?


Sujet :

Requêtes MySQL

  1. #1
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut Cette requête est-elle valide?
    Bonjour,

    Je travaille présentement à la correction d'un code disfonctionnel programmé par un stagiaire qui est passé avant moi et j'ai trouvé dans le code une requête dont le ne suis pas sur de la validité. Peut-être est-ce seulement que je n'en ai jamais fait comme ça mais je vous demande votre opinion sur sa validité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT c1.id, c2.id 
    FROM carte_temps2 as c1, carte_temps2 as c2
    WHERE c1.no_camion>0 
      AND c1.no_camion=c2.no_camion 
      AND (not (c1.id=c2.id)) 
      AND ((concat(if(c2.hrt < c2.hdq, c2.dfq, c2.ddq), " ", c2.hrt) 
            < concat(if(c1.htt<c1.hdq,c1.dfq,c1.ddq), " ", c1.htt)) 
           AND c1.od < c2.oaa );
    C'est la partie dans le concat() qui me pose problème. Comme le nom des colonnes est très peu significatif, en voici la description:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ddq : Date Debut Quart (AAAA-MM-JJ)
    dfq : Date Fin Quart (AAAA-MM-JJ)
    hdq : Heure Début Quart (HH:MM:SS)
    hrt : Heure Retour Terminal (HH:MM:SS)
    htt : Heure Départ Terminal (HH:MM:SS)
    oaa : Odomètre à l'Arrivée
    odc : Odomètre Dernier Client
    opc : Odomètre Premier Client
    Est-ce correct? Lorsque le j'exécute en console ça ne me retourne aucune erreur de syntaxe mais aucun enregistrement non plus.
    Pensez à la balise

  2. #2
    Membre averti Avatar de Soutou
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 328
    Points : 378
    Points
    378
    Par défaut
    Le résultat de ta requête dépend des données contenues dans les tables.

    Si tu n'es pas sûr, exécute là en enlevant les conditions les unes après les autres. Des données vont apparaître au fur et à mesure.

    Compose un jeu d'essai qui doit resortir et lance la requête initiale.

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: Cette requête est-elle valide?
    D'un point de vue syntaxe, il n'y a pas de problème, ça passe.

    Maintenant, d'un point de vue sémantique, c'est moins évident.

    En fait, ce qui se passe: Tu concatènes deux dates pour en faire une chaîne (avec un IF au millieu), puis tu prends deux autres dates, que tu concatènes aussi pour en faire une chaîne (également avec un IF au millieu). Tu auras donc deux chaînes de format "YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS" que tu compares entre elles.

    Vu que tes dates sont au format UNIX (année d'abord, puis mois...), tu peux faire des comparaisons de chaînes entre elles, il n'y a pas de problème. On a donc 4 dates dans 2 chaines: "Date1 Date2" et "Date3 Date4" (en faisant abstraction des IF...)

    Si Date1<Date2, alors le test renvoie 'Vrai'. Si Date1==Date2 (à la seconde près!), alors c'est Date3<Date4 qui est évaluée. Si Date1>Date2, alors ça renvoie 'faux'.

    Bref, ça peut éventuellement marcher. Par contre, pour le bien de tous (y compris de tes collègues qui vont devoir reprendre ton application), tu devrais essayer de comprendre ce que c'est sensé faire et faire des comparaisons de date classiques.

    ***

    Egalement pour plus de clareté : pense à utiliser une jointure INNER JOIN et donc à séparer tes conditions de jointure (dans le ON) des conditions de restriction de tes ensembles (dans le WHERE)

    Aussi, plutôt que d'écrire not(A=B), écrit directement A!=B, on comprend mieux.

    Enfin, n'hésite pas à mettre dans ton rapport que le stagiaire précédent était un gros naze et que ses requêtes sont incompréhensibles, donc peu maintenables...(le fait que tu te sois poser la question "c'est normal de faire comme ça?" montre que tu te poses les bonnes questions).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: Cette requête est-elle valide?
    Petite correction:

    J'avais pas vu que dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ddq : Date Debut Quart (AAAA-MM-JJ)
    dfq : Date Fin Quart (AAAA-MM-JJ)
    hdq : Heure Début Quart (HH:MM:SS)
    hrt : Heure Retour Terminal (HH:MM:SS)
    htt : Heure Départ Terminal (HH:MM:SS)
    oaa : Odomètre à l'Arrivée
    odc : Odomètre Dernier Client
    opc : Odomètre Premier Client
    certains champs sont des dates et d'autres sont des heures (j'ai considéré que tout était en DATETIME). Ca ne change rien à ce que je viens de dire.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Un autre truc que je comprends pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(c2.hrt < c2.hdq, c2.dfq, c2.ddq)
    Dans la condition du IF, on compare des heures pour déterminer quelle date on va utiliser plus loin pour la comparaison. C'est assez aléatoire comme truc ! (pour 2 moments t1 et t2 tels que t1<t2, tu peux avoir heure(t2) > heure(t1) si t1 et t2 sont sur 2 jours différents)

    Bref, ça m'a l'air bien pourrie comme requête !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. Cette requête est-elle possible ?
    Par cherche_encore dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/08/2013, 09h55
  2. cette requête est-elle possible ?
    Par night_flyers dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2009, 13h12
  3. Cette expression est elle valide ?
    Par mamelouk dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2007, 16h21
  4. cette requête est-elle correcte?
    Par spilliaert dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/02/2006, 22h33
  5. Pourquoi cette requête est lente ?
    Par zenzo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2006, 15h15

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