{MySQL} Sélection d'une liste de prix entre d
lodan
-
lodan -
lodan -
Bonjour,
J'ai une table "catalogue" de produits défini comme ceci :
Elle contient les informations suivantes :
Je cherche à faire une requête me donnant le tarif à appliquer
Le résultat devant me donner les informations suivantes :
Si je fait une requête en utilisant DATEDIFF()
J'obtiens comme résultat ;
Comment faire pour que le prix du produit 1235 soit 38 en prenant l'écart le plus petit.
Si j'ajoute à ma requete un
ça ne fonctionne pas.
Merci d'avance pour votre aide
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
Configuration: Windows XP Firefox 3.0.12
12 réponses
-
tu cehrche a faire une requete sur le critere date?
-
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é. -
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é? -
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 -
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. -
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... -
-
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 -
ç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. -
-
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. -
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