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

Fermé
lodan - 4 août 2009 à 14:56
 lodan - 5 août 2009 à 09:24
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 mardi 21 juillet 2009 Statut Membre Dernière intervention 4 août 2009 4
4 août 2009 à 15:15
tu cehrche a faire une requete sur le critere date?
0
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 mardi 21 juillet 2009 Statut Membre Dernière intervention 4 août 2009 4
4 août 2009 à 15:47
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 mardi 21 juillet 2009 Statut Membre Dernière intervention 4 août 2009 4
4 août 2009 à 15:55
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
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 mardi 21 juillet 2009 Statut Membre Dernière intervention 4 août 2009 4
4 août 2009 à 16:25
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
Merci aymenrafik,

C'est justement cette condition qui me manque.
0
aymenrafik@yahoo.fr Messages postés 16 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 4 août 2009 4
4 août 2009 à 16:36
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
ç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
tu cherche tt le cathalogue ayant un prix valide c'est ca?
reforule ta requete stp
0
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
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