selection du plus proche de manière inférieur

xaxa
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 16:05

Bonjour. J'ai une table :

Code : Tout sélectionner

id_tarif_log cout_cmd cout_prod date_MAJ 1 2.2 0.15 2011-02-17 00:00:00 2 12 45 2011-03-17 14:37:58
Je donne une date et je veux sélectionner la ligne dont la date est la plus proche de manière inférieur.
La si je donne en entré 2011 et 04 ( pour le mois) je veux que la deuxième ligne.

Comment dois je faire cela?

moi je faisais
SELECT cout_cmd as cmd, cout_prod as prod
FROM tarif_logistique
WHERE YEAR(date_MAJ) <= '$annee_cmd'
AND MONTH(date_MAJ) <= '$mois_cmd'
Mais évidement, ca me sélectionne toutes les lignes inférieur aux conditions. Moi je voudrai que la plus proche de manière inférieur

Merci de votre aide

ViPHP
xTG
ViPHP | 7331 Messages

17 févr. 2011, 16:10

Considères-tu rechercher la date la plus proche de 2011-04-01 ? Ou bien en fin de mois ?
Ensuite pour ne retourner qu'un certain nombre d'enregistrements il y a LIMIT pour MySQL/PostgreSQL.
Pour Oracle par contre je ne sais pas si c'est ce que tu utilises. :)

Invité
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 16:21

euh je recherche la date la plus proche de 2011-04-01 de manière inférieur donc ce sera celle de 2011-03.
La mon bout de code selectionne les lignes ou la date est inférieur a celle que je donne mais il me les donne toutes. Je ne veux que la plus proche.
En utilisant LIMIT 1 ; il me retourne qu'un seul résultat mais le premier qu'il a trouvé et par exemple dans mon cas il ne retourne pas la valeur inférieur la plus proche de ce que jai mis en entrée

ViPHP
xTG
ViPHP | 7331 Messages

17 févr. 2011, 17:30

Donc tu peux faire ainsi :
avec $date = $annee_cmd . "-" . $mois_cmd . "-01";
SELECT cout_cmd AS cmd, cout_prod AS prod
FROM tarif_logistique
WHERE date_MAJ <= $date
LIMIT 1
Cela devrait te renvoyer la bonne date. :)

Mammouth du PHP | 672 Messages

17 févr. 2011, 17:34

LIMIT 1 te sors le premier enregistrement rendu (et pas trouvé). La nuance est subtile, mais importante...

=>
1. Requête de base => SELECT champs FROM table WHERE condition

2. On veut du plus récent au plus vieux => SORT BY champtri DESC

3. On ne veut que le premier => LIMIT 1


Rien à voir, mais ta requête risque de poser problème :
SELECT cout_cmd AS cmd, cout_prod AS prod
FROM tarif_logistique
WHERE YEAR(date_MAJ) <= '$annee_cmd'
AND MONTH(date_MAJ) <= '$mois_cmd'
Les articles modifiés entre le <Mois demandé> + 1 et décembre des années précédentes ne sont pas inclus.
En clair, si tu passes la requête le premier janvier 2011, tu ne trouveras pas les modifications deu 31 décembre 2010...

xaxa
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 17:39

Cette requête fonctionne bien également
SELECT id_tarif_log, cout_cmd, cout_prod, date_MAJ
  FROM tarif_logistique
 WHERE date_MAJ = (SELECT max(date_MAJ)
                     FROM tarif_logistique
                    WHERE YEAR(date_MAJ)  < '$annee'
                               OR (
                                    YEAR(date_MAJ) = '$annee'
                                    AND MONTH(date_MAJ) <= '$mois'
                                )
                     )
 

xaxa
Invité n'ayant pas de compte PHPfrance

17 févr. 2011, 17:47

Avec cette requête, je ne pense que j'aurai le problème dont parle macgawel du moins je ne crois pas et je n'espère pas ..

ViPHP
ViPHP | 2577 Messages

18 févr. 2011, 09:14

Bonjour,
SELECT id_tarif_log, cout_cmd, cout_prod, date_MAJ
FROM tarif_logistique
WHERE YEAR(date_MAJ)  < '$annee'
        OR (
             YEAR(date_MAJ) = '$annee'
            AND MONTH(date_MAJ) <= '$mois')
order by date_MAJ DESC
limit 1
Ca me semble plus simple. Les requêtes imbriquées sont à éviter.