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 :

Besoin d'aide sur une erreur de requête [MySQL-5.1]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Besoin d'aide sur une erreur de requête
    Bonjour à tous,

    quand je tape la requête suivante :
    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 
    resa_id, 
    resa_num_pms, 
    resa_outil_pms, 
    resa_periode, 
    resa_statut, 
    resa_date_arrivee, 
    resa_date_depart,
    (IF (TO_DAYS(resa_date_arrivee) - TO_DAYS(NOW()) > 0) THEN
    		'Client attendu';
    ELSE
    		IF(TO_DAYS(resa_date_depart) - TO_DAYS(NOW()) > 0) THEN
    				'Client parti';
    		ELSE
    				'Client present';
    		END IF;
    END IF) AS statut_corrige
    FROM finalresas;
    J'ai l'erreur suivante :
    [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') THEN
    'Client attendu'' at line 9
    Je ne comprends pas ce qui ne va pas dans ma requête, d'avance merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour bpdelavega,


    Je n’utilise pas MySQL, mais quand je vois des points-virgules en plein milieu d’une requête, je conclus que déjà la syntaxe n’est pas respectée dans le cadre de la norme SQL : un point-virgule sert (facultativement) à clore une instruction SQL. Cela dit, je suppose que vous vous êtes rendu compte de la chose.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonjour et merci fsmrel

    Je pense que le problème ne provient pas de là, voici la requête modifiée :

    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 
    resa_id, 
    resa_num_pms, 
    resa_outil_pms, 
    resa_periode, 
    resa_statut, 
    resa_date_arrivee, 
    resa_date_depart,
    (IF (TO_DAYS(resa_date_arrivee) - TO_DAYS(NOW()) > 0) THEN
    		'Client attendu'
    ELSE
    		IF(TO_DAYS(resa_date_depart) - TO_DAYS(NOW()) > 0) THEN
    				'Client parti'
    		ELSE
    				'Client present'
    		END IF
    END IF) AS statut_corrige
    FROM finalresas;
    Voici le message d'erreur :
    [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') THEN
    'Client attendu'

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    IF... THEN..., en SQL, ça ne peut pas fonctionner...
    Il faut plutôt utiliser la syntaxe CASE WHEN... THEN... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT 
    resa_id, 
    resa_num_pms, 
    resa_outil_pms, 
    resa_periode, 
    resa_statut, 
    resa_date_arrivee, 
    resa_date_depart,
    CASE
      WHEN TO_DAYS(resa_date_arrivee) - TO_DAYS(NOW()) > 0 THEN 'Client attendu'
      WHEN TO_DAYS(resa_date_depart) - TO_DAYS(NOW()) > 0 THEN 'Client parti'
      ELSE 'Client present'
    END AS statut_corrige
    FROM finalresas;
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Plus d'erreur de syntaxe dans la requête
    Merci beaucoup CED, grâce à toi je n'ai plus d'erreur dans la requête. Cependant, mon problème reste présent concernant les résultats. Voici ces derniers :

    RESA_ID RESA_NUM RESA_PMS STATUT _Client Statut_Resa Date_Arrivee Date_Depart Statut_Corrige
    1 R18975_7474V4 FRONTRES Client parti OK 2012-01-01 2012-01-02 Client present
    2 R18977_7474V4 FRONTRES Client parti OK 2012-01-01 2012-01-04 Client present
    3 R18978_7474V4 FRONTRES Client parti OK 2012-01-01 2012-01-05 Client present
    162394 8393175 FIDELIO Client present OK 2013-11-19 2013-11-21 Client parti
    162395 8393177 FIDELIO Client present OK 2013-11-19 2013-11-21 Client parti
    162396 8393426 FIDELIO Client attendu OK 2013-12-07 2013-12-15 Client attendu
    162381 8390424 FIDELIO Client attendu OK 2013-12-29 2013-12-30 Client attendu
    162382 8390425 FIDELIO Client attendu OK 2013-11-30 2013-12-01 Client attendu
    162383 8390427 FIDELIO Client attendu OK 2013-11-30 2013-12-01 Client attendu
    Je n'arrive vraiment pas à avoir ce que je veux, les statuts_corriges sont faux.
    Encore merci CED

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    inversez l'inégalité pour "client partis" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CASE
      WHEN TO_DAYS(resa_date_arrivee) - TO_DAYS(NOW()) > 0 THEN 'Client attendu'
      WHEN TO_DAYS(resa_date_depart) - TO_DAYS(NOW()) < 0 THEN 'Client parti'
      ELSE 'Client present'
    END AS statut_corrige

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Cela fonctionne parfaitement
    Super merci beaucoup,
    Cela fonctionne parfaitement, voici ma requête finale, car j'ai certaines valeurs de dates qui sont nulles, j'espère que la modification apportée ne provoquera des effets de bords non désirés :

    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
     
    SELECT 
    resa_id, 
    resa_num_pms, 
    resa_outil_pms, 
    resa_periode, 
    resa_statut, 
    IFNULL(resa_date_arrivee,'2012-01-01') AS resa_date_arrivee, 
    IFNULL(resa_date_depart,'2012-01-01') AS resa_date_depart,
    (CASE
      WHEN TO_DAYS(IFNULL(resa_date_arrivee,'2012-01-01')) - TO_DAYS(NOW()) > 0 THEN 'Client attendu'
      WHEN TO_DAYS(IFNULL(resa_date_depart,'2012-01-01')) - TO_DAYS(NOW()) < 0 THEN 'Client parti'
      ELSE 'Client present'
    END) AS statut_corrige
    FROM finalresas;
    Selon vous, ma requête est à présent OK ?

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    tout dépend du comportement que vous voulez dans le cas des dates NULL.

    Mais effectivement, vous pourriez avoir des cas bizarres, par exemple des clients partis avant même d'être arrivés ! (date d'arrivée = '2013-01-01', date de départ NULL)

    Pourquoi ces dates sont NULL, et pourquoi les remplacer par la valeur '2012-01-01' qui semble être arbitraire ?

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Merci, oui en effet cela est bizarre : il s'agit de tables d'un logiciel que je ne connais pas bien, mais je vais creuser en effet pour voir comment se fait-il que certaines fois ces valeurs soient nulles, et dans ce cas, où trouver la bonne date. Encore merci pour votre aide.

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

Discussions similaires

  1. Besoin d'aide sur une erreur javascript Uncaught Exception
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/11/2007, 16h11
  2. besoin d'aide sur une requête mysql
    Par unmulot dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/07/2006, 13h17
  3. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  5. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29

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