{MySQL} Sélection d'une liste de prix entre d

lodan -  
 lodan -
Bonjour,


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

Code catalogue
code produit
date_debut
date_fin
prix


Elle contient les informations suivantes :


Code catalogue = 1
code produit = 1235
date_debut = 2009-01-01
date_fin = 2009-12-31
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 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



Si je fait une requête en utilisant DATEDIFF()
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 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
GROUP BY produit HAVING MIN(ecart)


ça ne fonctionne pas.

Merci d'avance pour votre aide
A voir également:

12 réponses

aymenrafik@yahoo.fr Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   4
 
tu cehrche a faire une requete sur le critere date?
0
lodan
 
Bonjour et merci,

Oui sur le critère date et sur l'unicité du produit. En fait le tarif de certains produits peut varier dans le temps en fonction de la saisonnalité.
0
aymenrafik@yahoo.fr Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   4
 
Bon j'ai du mal a comprendre
1-c'est quoi tes clefs primaires?
2-tu cherche le prix connaissant la date et le produit?ou juste la date et tu cherche tt les produit qui ont un prix valide a la date recherché?
0
aymenrafik@yahoo.fr Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   4
 
pk t'utilise datediff??
a tu essayé symplemant
SELECT code_produit, date_debut, date_fin, , prix
FROM catalogues
WHERE
sysdate
BETWEEN date_debut
AND date_fin

si ca ne marche pas ca devrai venir du format utilisée pour les date
dans ce cas la utilise to_date
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lodan
 
Si j'utilise ta requete, je me retrouve avec 2 résultats pour le produits 1235

Or je n'en veux qu'un, celui dont la date de début est le plus proche de la date du jour.
0
aymenrafik@yahoo.fr Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   4
 
ah ok je voie mainteant!
essaye ca :
SELECT code_produit, date_debut, date_fin, , prix
FROM catalogues
WHERE
sysdate
BETWEEN date_debut
AND date_fin
order desc by date_debut
en ajoutant une condition pour sélectionner que la première ligne des résultat je l'ai déjà utilisé mais je m'en rappel plus...
0
lodan
 
Merci aymenrafik,

C'est justement cette condition qui me manque.
0
aymenrafik@yahoo.fr Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   4
 
voila ca me revien :)
c'est ROWNUM !!
=>SELECT code_produit, date_debut, date_fin, , prix
FROM catalogues
WHERE
sysdate
BETWEEN date_debut
AND date_fin
where rownum<=1
order desc by date_debut
0
lodan
 
ça c'est bon pour oracle.

En mysql c'est "limit 1"

Mais, il ne faut pas qu'il me prenne un seul enregistrement.

Il me faut effectivement 1 seule ligne par produit, mais tout le catalogue tout de même.
0
dervorv
 
tu cherche tt le cathalogue ayant un prix valide c'est ca?
reforule ta requete stp
0
lodan
 
Pardon, je n'ai pas été clair, je le vois.

Oui, je veux tous les prix valides aujourd'hui et un seul prix valide par produit.
0
lodan
 
La solution que j'ai trouvé est de passer par 2 requêtes imbriquées et en prenant les écarts entre la date du jour et la date de début de catalogue

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)


Et ça marche

Merci pour l'aide
0