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 :

Requête SQL : Opérations DATE_ADD compliquées


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut Requête SQL : Opérations DATE_ADD compliquées
    Bonjour,

    Je dispose actuellement d'une base de données qui dispose de deux tables dont j'ai perdu le lien qui les reliait. Je tente donc, au travers de la requête suivante, d'associer un Abonnement à un Mouvement :

    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 m.id_mouvement, a.id_abonnement, 
    IF (pk.duree = 10000, 
        '12 MONTH', 
        IF (pk.duree = 100,
            '1 MONTH',
            '1 DAY')
        ) AS startDelay
    FROM mouvements m, abonnements a, composition_pack p, acces_pack pk
    WHERE m.id_pack = pk.id_pack
    AND m.id_pack = p.id_pack
    AND p.id_formule = a.id_formule
    AND DATE_ADD(a.date_expiration, INTERVAL - startDelay) = m.date_validation
    ORDER BY m.id_mouvement,a.id_abonnement ASC
    LIMIT 10
    J'ai mis en gras là où la requête me pose problème. Dans la première partie (avec IF) je détermine à combien de jours/mois je vais devoir faire le calcul sur la date dans la 2ème partie (DATE_ADD).

    Concrètement :
    - si la valeur de pk.duree est à 10000 => je dois soustraire 12 mois à a.date_expiration.
    - si la valeur de pk.duree est à 100 => je dois soustraire 1 mois à a.date_expiration.
    - si la valeur de pk.duree est à 1 => je dois soustraire 1 jour à a.date_expiration.

    Je pensais qu'en mettant dans le IF (de la 1e partie de la requête) un bout de la requête que j'allais utiliser ('12 MONTH' / '1 MONTH' / '1 DAY') je pourrais réutiliser ceci dans ma condition. Il semblerait que non.

    L'erreur obtenue par MySQL est la suivante :

    #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 ') = m.date_validation
    ORDER BY m.id_mouvement,a.id_abonnement ASC
    LIMIT 10'
    Auriez vous une idée qui pourrait résoudre mon problème ?

    Merci par avance pour votre aide.

    EDIT : Ma version de MySQL est : Ver 14.12 Distrib 5.0.67, for redhat-linux-gnu (i686)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    J'ai tenté ceci, sans grand succès. Visiblement, il est impossible de sortir startDelay qui est créé dans le SELECT pour l'utiliser dans le WHERE.

    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 m.id_mouvement, a.id_abonnement, 
    IF (pk.duree = 10000, 
        DATE_ADD(a.date_expiration, INTERVAL - 12 MONTH), 
        IF (pk.duree = 100,
            DATE_ADD(a.date_expiration, INTERVAL - 1 MONTH),
            DATE_ADD(a.date_expiration, INTERVAL - 1 DAY))
        ) AS startDelay
    FROM mouvements m, abonnements a, composition_pack p, acces_pack pk
    WHERE m.id_pack = pk.id_pack
    AND m.id_pack = p.id_pack
    AND p.id_formule = a.id_formule
    AND m.date_validation = startDelay
    ORDER BY m.id_mouvement,a.id_abonnement ASC
    LIMIT 10

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT m.id_mouvement, a.id_abonnement, 
        DATE_ADD(a.date_expiration, INTERVAL 
                     - IF(pk.duree=1000,12 MONTH, 
                       IF (pk.duree = 100, 1 MONTH, - 1 DAY))) AS startDelay
    FROM mouvements m
    INNER JOIN composition_pack P ON m.id_pack = p.id_pack
    INNER JOIN abonnements a ON  p.id_formule = a.id_formule
    INNER JOIN acces_pack pk ON m.id_pack = pk.id_pack
    WHERE   m.date_validation = DATE_ADD(a.date_expiration, INTERVAL 
                                           - IF(pk.duree=1000,12 MONTH, 
                                                 IF (pk.duree = 100, 1 MONTH, - 1 DAY)))
    ORDER BY m.id_mouvement,a.id_abonnement ASC
    LIMIT 10
    Et comme ça ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Bon, j'ai trouvé... Merci quand même :-)

    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
    SELECT *
    FROM mouvements m, abonnements a, composition_pack p, pack pk
    WHERE 	m.id_pack = pk.id_pack
    AND 	m.id_pack = p.id_pack
    AND 	p.id_formule = a.id_formule
    AND 	m.date_validation = 
    (
    	SELECT IF (pk.duree = 10000, 
    	DATE_ADD(a.date_expiration, INTERVAL - 12 MONTH), 
    	IF (pk.duree = 100,
    		DATE_ADD(a.date_expiration, INTERVAL - 1 MONTH),
    		DATE_ADD(a.date_expiration, INTERVAL - 1 DAY))
    	) AS startDelay
     
    )
    ORDER BY m.id_mouvement,a.id_abonnement ASC

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

Discussions similaires

  1. Requête SQL compliquée
    Par fips1962 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/05/2009, 18h52
  2. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 14h50
  3. requête sql compliquée
    Par root76 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/08/2007, 15h53
  4. requête sql compliquée
    Par caoutchouc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2007, 16h21
  5. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 22h52

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