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 :

Sélection d'une liste de prix entre date


Sujet :

Requêtes MySQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Sélection d'une liste de prix entre date
    Bonjour,

    J'ai une table "catalogue" de produits défini comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code catalogue
    code produit
    date_debut
    date_fin
    prix
    Elle contient les informations suivantes :
    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
    Code catalogue = 1
    code produit = 1235
    date_debut = 2009-01-01
    date_fin = 2009-01-12
    prix = 78
    Code catalogue = 2
    code produit = 1235
    date_debut = '2009-07-30'
    date_fin = '2009-08-15'
    prix = 38
    Code catalogue  = 1 
    code produit = 3526
    date_debut = '2009-05-01'
    date_fin = '2009-12-31'
    prix = 45
    Je cherche à faire une requête me donnant le tarif à appliquer

    Le résultat devant me donner les informations suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Code catalogue = 2
    code produit = 1235
    date_debut = '2009-07-30'
    date_fin = '2009-08-15'
    prix = 38
    Code catalogue  = 1 
    code produit = 3526
    date_debut = '2009-05-01'
    date_fin = '2009-12-31'
    prix = 45
    Voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT produit, prix
    FROM catalogue
    WHERE  (
    '2009-07-31'
    BETWEEN date_debut
    AND date_fin
    OR '2009-07-31' >= date_debut
    AND date_fin = '0000-00-00'
    )
    J'ai 2 code produits identiques et je n'en veux qu'un, c'est a dire que celui dont les dates de début et fin sont les plus proche de la date du jour.

    J'ai fait un "group by" sur le produit et dans ce cas le prix est à 78.

    J'ai fait des tris sur les date ASC et DESC, mais le pris reste à 78 pour le produit 1235, alors que c'est 68 quie je voudrais avoir.

    Comment dois-je exprimer ma requête pour cibler au mieux les dates de début et de fin

    Merci d'avance

  2. #2
    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 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

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

    Ce sont les conditions de la requête qui ne sont pas correctes.
    Il faut séparer les 2 conditions par des parenthèses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select produit, prix
    from catalogue
    where ('2009-07-31' between date_debut and date_fin)
    or ('2009-07-31' >= date_debut and date_fin = '0000-00-00')
    ced

  3. #3
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Bonjour et merci,

    Cela ne change rien.

  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 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 783
    Points
    23 783
    Par défaut
    Bon, alors le problème porte très certainement sur la seconde condition...
    Comme je ne sais pas trop comment sont stockées tes dates non renseignées, j'ai repris ton code initial. Mais peut-être les dates non renseignées sont-elles à NULL (ce qui serait plus juste, d'ailleurs).

    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT produit, prix
    FROM catalogue
    WHERE ('2009-07-31' BETWEEN date_debut AND date_fin)
    OR ('2009-07-31' >= date_debut AND date_fin IS NULL)
    ced

  5. #5
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Bonjour Ced,

    Non il n'y a pas de date NULL.

    Le mieux se serait de prendre la différence entre CURDATE() et la date_debut et de ne garder que l'enregistrement dont la différence est la plus petite.

    Faire un DATEDIFF(CURDATE(), date_debut) ?

  6. #6
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Damned Ced, j'ai fait une erreur dans mes données d'exemples pour le 1er produit au niveau de la date de fin. Ce n'est '2009-01-12', mais '2009-12-31'

    Si je fait une requête en utilisant DATEDIFF()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT code_produit, date_debut, date_fin, DATEDIFF(CURDATE(), date_debut) AS ecart, prix
    FROM catalogues
    WHERE (
    CURDATE( )
    BETWEEN date_debut
    AND date_fin
    OR CURDATE( ) >= date_debut
    AND date_fin = '0000-00-00'
    )
    J'obtiens comme résultat ;

    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
     
    code produit = 1235
    date_debut = 2009-01-01
    date_fin = 2009-12-31
    ecart = 215
    prix = 78
    Code catalogue = 2
    code produit = 1235
    date_debut = '2009-07-30'
    date_fin = '2009-08-15'
    ecart = 5
    prix = 38
    Code catalogue  = 1 
    code produit = 3526
    date_debut = '2009-05-01'
    date_fin = '2009-12-31'
    ecart 95
    prix = 45
    Comment faire pour que le prix du produit 1235 soit 38 en prenant l'écart le plus petit.

    Si j'ajoute à ma requete un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY produit HAVING MIN(ecart)
    ça ne fonctionne pas.

  7. #7
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Bon, j'ai fini par trouver une solution en passant par les dates et leur différences avec la date du jour

    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 code_produit,  prix
    (SELECT code_produit,
    MIN(DATEDIFF(curdate(), date_debut)) AS mini
    FROM catalogues
    WHERE (
    CURDATE( )
    BETWEEN date_debut
    AND date_fin
    OR CURDATE( ) >= date_debut
    AND date_fin = '0000-00-00')
    GROUP BY code_produit) AS catalogues_filtre
    ON catalogues.code_produit = catalogues_filtre.code_produit
    WHERE catalogues.code_produit = catalogues_filtre.code_produit
    AND mini = DATEDIFF(curdate(), date_debut)
    Il y a peut-être plus performant ?

    Merci pour l'aide

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 12/07/2006, 22h04
  2. Réponses: 1
    Dernier message: 12/07/2006, 09h51
  3. obliger sélection dans une liste déroulante
    Par doyle01 dans le forum Access
    Réponses: 4
    Dernier message: 15/05/2006, 15h31
  4. Réponses: 29
    Dernier message: 03/11/2005, 10h37
  5. Garder fixe la sélection d'une liste déroulante
    Par hysteresis dans le forum ASP
    Réponses: 11
    Dernier message: 20/10/2005, 14h34

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