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 :

selection du plus proche de manière inférieur


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Par défaut selection du plus proche de manière inférieur
    Bonjour. J'ai une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    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

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il faut le faire en passant par une sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    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_cmd'
                          AND MONTH(date_MAJ) <= '$mois_cmd')

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Par défaut
    merci ca fonctionne
    c cool
    je pense jamais au ss requête.

    Jte remercie pour ta réactivité.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Par défaut
    En fait c bizarre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    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)  <= '2015'
                          AND MONTH(date_MAJ) <= '2')
    Ca me renvoi cette ligne
    1 2.2 0.15 2011-02-17 00:00:00

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    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)  <= '2015'
                          AND MONTH(date_MAJ) <= '4')
    Ca me renvoit cette ligne:
    2 12 45 2014-03-17 14:37:58


    J'ai changer la deuxième ligne de ma base de données. J'ai transformé l année 2011 en 2014 pour tester.
    Donc dans les deux requêtes précédentes le résultat aurait du être la même ligne , celle avec 2014.

    La requete fonctionne bien avec seulement le WHERE sur les années ou seulement sur les mois mais les deux clause du where n'ont pas l'air de fonctionner ensemble.

    Merci

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Essayez d'être plus clair car même après trois lectures, je n'ai toujours pas compris votre test et ce qui ne va pas.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Par défaut
    Oui au temps pour moi.
    Alors dans ma base il y a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    id_tarif_log 	  cout_cmd 	cout_prod 	date_MAJ
    1 	                  2.2 	        0.15            	2011-02-17 00:00:00
    2 	                  12 	         45            	2014-03-17 14:37:58
    Je n'ai changé que l'année de la deuxième ligne.


    En testant votre requête avec comme entrée l'année 2015 et le mois 2
    ca me sélectionne la ligne numéro 1 c'est à dire celle ou date_MAJ = 2011-02
    Or pour ces valeurs la date la plus proche de manière inférieur est la deuxieme ligne où date_MAJ= 2014-03

    En testant la même requête avec comme entrée toujours l'année 2015 et comme mois 4 et ben ce coup ci , cela me renvoi la ligne numéro 2 où la date_MAJ est 2014-03. Ce coup ci la requête m'a bien renvoyé ce qu'il fallait.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,


    En effet, 3 est plus grand que 4 (et ceci est valable également dans les SGBDR )

    Donc dans votre premiere requete, la condition MONTH(date_MAJ) <= 2 n'est pas remplie.

    Pour etre correcte, vous devriez ecrire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    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)  < '2015'
                                   OR (
                                        YEAR(date_MAJ) = '2015'
                                        AND MONTH(date_MAJ) <= '2'
                                    )
                         )

    Cela dit, vu que vous avez bien une colonne de type date, il me semble que vous obtiendrez de meilleures performances en "reconstruisant" la date à partir de vos deux parametres annee et mois, puis en faisant une simple comparaison...

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/12/2012, 14h22
  2. [MySQL] selection plus proche combinaison
    Par worldhugo dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 18/08/2009, 12h00
  3. Réponses: 10
    Dernier message: 06/03/2007, 14h36
  4. [C#][VS2003] Arrondir un float à l'inférieur le plus proche
    Par gregos dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/11/2005, 12h14
  5. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52

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