Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/02/2011, 15h07   #1
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
Par défaut selection du plus proche de manière inférieur

Bonjour. J'ai une table:
Code :
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 :
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
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h13   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faut le faire en passant par une sous-requête :
Code :
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')
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h25   #3
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
merci ca fonctionne
c cool
je pense jamais au ss requête.

Jte remercie pour ta réactivité.
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h36   #4
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
En fait c bizarre.
Code :
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 :
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
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h39   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h50   #6
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
Oui au temps pour moi.
Alors dans ma base il y a

Code :
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.
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h54   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Merci pour les précisions.
Effectivement comme vous l'avez déduit il y a deux tests séparés, un pour l'année et un pour le mois.

À priori votre colonne date_MAJ possède bien un format de type date.
Il faut donc simuler une date fixe à partir de ce que vous allez saisir : pour vous aider sur ce point j'ai besoin de connaître votre SGBD et sa version.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 15h58   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Une condition de ce type ne serai-t-elle pas suffisante ?
Code :
1
2
 
WHERE year(date_maj) < '$annee_cmd' OR (year(date_maj) = '$annee_cmd' AND month(date_maj) = '$mois_cmd')
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 16h04   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 16h05   #10
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
mysql 5.1.49
phpmyadmin 3.3.5
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 16h09   #11
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
Je vais tenter vos solutions.
Merci
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 16h11   #12
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Sur mysql il y a YEAR_MONTH
http://dev.mysql.com/doc/refman/5.0/...functions.html
Citation:
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
Donc quelque chose comme :
Code :
EXTRACT(YEAR_MONTH FROM date_MAJ) <= 201502;
201502 étant probablement un nombre plus qu'une chaîne de caractère, à vérifier.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 16h25   #13
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tout à fait, il vaut mieux reconstruire une date à partir des constantes plutôt que de convertir toutes les dates de la table.

J'espère ne pas avoir commis d'impair de syntaxe :
Code :
1
2
3
4
5
SELECT id_tarif_log, cout_cmd, cout_prod, date_MAJ
  FROM tarif_logistique
 WHERE date_MAJ = (SELECT max(date_MAJ)
                     FROM tarif_logistique
                    WHERE date_MAJ <= STR_TO_DATE('20150401', '%Y%m%d'))
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 17h05   #14
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Oui c'est mieux de ne pas convertir effectivement, mais je rejouterais LAST_DAY pour coller au besoin initial:
Citation:
mysql> SELECT LAST_DAY('2003-02-05'), LAST_DAY('2004-02-05');
-> '2003-02-28', '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
-> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
-> NULL
Code :
LAST_DAY(STR_TO_DATE('20150401', '%Y%m%d'))
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h17.


 
 
 
 
Partenaires

Hébergement Web