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 :

Requete SQL simple : selectionner un couple de valeur


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut Requete SQL simple : selectionner un couple de valeur
    Bonjour, bonjour,

    J'ai de sérieuses difficultés avec une requete sql, j'utilise mysql5.0 sur 1and1.

    L'idée générale de ma requete est de selectionner une date et une valeur de production par jour, sur une période donnée, ici on cherche les valeurs sur 1 an.
    (Je selectionne un couple de valeur (date/production) par jour, il est nécessaire que ce soient la valeurs de fin de journée)

    La table ressemble grossierement à qqch comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    date                  |       prod          |
    ____________________________________
            ...                        ...
    2012-05-14 08:00:00   |       152000      |
    2012-05-14 08:10:00   |      152200       |
    2012-05-14 08:20:00   |       152300      |
            ...                        ...
    2012-05-14 20:10:00   |       171900      |
    2012-05-14 20:20:00   |       172000      |
    2012-05-15 08:00:00   |       172100      |
            ...                        ...
    La requete :
    SELECT date, MAX(production), FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date) <= 365 GROUP BY DAYOFYEAR(date) ORDER BY date ASC (1)

    J'obtiens bien une valeur de production et une date par jour, soit 365 couples de résultats

    Mon problème est que lorsque j'utilise MAX sur production, la requete selectionne bien le max de la variable mais il est impossible d'avoir la date correspondante (le couple [date / prod] présent en BD), ex :
    Résultats d'une journée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    date               | MAX(prod)|
    ___________________________
    2012-05-14 08:00:00 | 172000|
    -> Or la véritable date qui correspond à cette production est 2012-05-14 20:20:00


    (La solution que j'ai trouvé sur des petites périodes, pour être sûr de prendre le dernier couple date/production de la journée, est de faire : 'select prod, date from table where date like '%datecherchée%' order by date DESC limit 1' OU 'select MAX(prod), MAX(date) from table where date like '%datecherchée%''
    ici on selectionne toutes les données de la journée pour les trier de la plus récente à la plus ancienne, j'ai donc bien le dernier couple de la journée cherchée. Mais faire boucler 365 fois cette requete bwarf!)

    (dans ma premiere requete) En utilisant le '...GROUP BY DAYOFYEAR(date)...' pour que la requete s'execute sur 365 jours, le ORDER BY ne trie que l'ensemble des résultats, et n'a aucun effet sur les valeurs sélectionnées en base.

    En utilisant MAX sur date et sur production j'aurai la majorité du temps les bons résultats , mais je ne veux pas utiliser MAX car si par exemple la derniere donnée de production bug (est à 0 ou à une valeur inférieur à la précédente), MAX ne me le sélectionnera jamais et donc je ne le saurais pas -> j'aurai un couple avec : une valeur de production du matin, et une date du soir -> très mauvais!!!

    Comment je peux faire fonctionner cette requête pour que : la date et la production sélectionnées soient à chaque fois le dernier couple de valeur de la journée :

    SELECT date, production, FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date) <= 365 AND GROUP BY DAYOFYEAR(date) ORDER BY date ASC

    J'ai essayé quelques requêtes imbriquées, que je n'ai pas vraiment réussi à faire fonctionner ou alors avec un temps d'exécution beaucoup trop long.

    J'ai pas l'impression que ce que je cherche à faire soit très compliqué, mais je patauge, je dois mal m'y prendre. Avis à la populas si quelqu'un peu m'aider!

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Est-ce que, pour une date donnée, vous pouvez avez avoir plusieurs fois le même numéro "prod" ?

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si j'ai bien compris le besoin...

    1) Quelle est la dernière date/heure de chaque jour ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DATE(`date`) AS Jour, 
    	MAX(`date`) AS derniere_date_heure
    FROM la_table
    GROUP BY DATE(`date`)
    2) On récupère la prod de cette dernière date/heure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT tmp.Jour, t.prod
    FROM la_table t
    INNER JOIN
    (
    	SELECT DATE(`date`) AS Jour, 
    		MAX(`date`) AS derniere_date_heure
    	FROM la_table
    	GROUP BY DATE(`date`)
    ) tmp ON tmp.derniere_date_heure = t.`date`
    ORDER BY t.`date`
    Au passage, 'date' est un mauvais nom de colonne car c'est un mot réservé du langage SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut
    Merci beaucoup CinePhil,

    C'est exactement le comportement que je souhaitais obtenir. Je crois que j'ai de pas mal de chose à apprendre sur les jointures !

    Merci pour cette très belle requête.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    En utilisant MAX sur date et sur production j'aurai la majorité du temps les bons résultats , mais je ne veux pas utiliser MAX car si par exemple la derniere donnée de production bug (est à 0 ou à une valeur inférieur à la précédente), MAX ne me le sélectionnera jamais et donc je ne le saurais pas -> j'aurai un couple avec : une valeur de production du matin, et une date du soir -> très mauvais!!!
    Vérifiez bien la solution de Cinephil car il pourrai y avoir un problème.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut
    J'ai l'impression qu'elle marche plutôt bien.
    Mon problème dans ma requête était que MAX(date) et MAX(prod) n'étaient pas forcément le dernier couple (si un bug survenait).
    Or dans le requête de cinePhil il va chercher la dernière date de chaque journée, puis dans le ON sélectionne la production correspondant à la dernière date sélectionner. Donc même si ma production se remet à 0, la requête sélectionnera bien la dernière production et non la plus élevée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete sql pour selectionner la ligne suivante
    Par evra76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/10/2009, 12h12
  2. requete sql pour selectionner certains éléments
    Par moustique95 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/06/2008, 20h53
  3. requete SQL multichamps/dans une liste de valeur
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2006, 15h48
  4. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39
  5. Plantage requete SQL simple sous Delphi7/ADO avec Access
    Par tomy29 dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/08/2005, 11h09

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