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 :

Récuperer valeur max d'un mois ou d'une année avec la date de la valeur


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Récuperer valeur max d'un mois ou d'une année avec la date de la valeur
    Bonjour
    j'ai une raspberry pi qui log des données météo dans une base
    j'arrive à récupérer les valeurs max et min du mois en cours et de l'année
    mais je n'arrive pas à récupérer la date de ces valeurs, en fait ma requête me renvoie bien les valeurs demandées mais avec la première date du mois

    voici ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT *, DATE(CREATED) AS date, MIN(ROUND(AMBIENT_TEMPERATURE,1)) AS min_temp, MAX(ROUND(AMBIENT_TEMPERATURE,1)) AS max_temp
    FROM WEATHER_MEASUREMENT
    WHERE (MONTH(DATE(CREATED)) = Month(NOW()));";

    +------------+----------+----------+
    | date | min_temp | max_temp |
    +------------+----------+----------+
    | 2016-05-01 | 17.8 | 43.1 |
    +------------+----------+----------+

    or par exemple la max_temp est d'aujourdh'ui.

    Quelqu'un pourrait-il m'aider s'il vous plait car ça me dépasse un peu là ... merci !

    jerome

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Avec tout autre SGBD que MySQL, cette requête aurait été rejetée...
    MySQL l'accepte et retourne des résultats incohérents. C'est un choix.

    Déjà, il y a peu de chances que la température minimum et la température maximum se rencontrent le même jour.
    Donc, il faut afficher deux dates, sélectionnées sur deux critères différents (temp min ou max).

    Voici une requête pour identifier la date à laquelle le minimum est atteint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  DATE(tmn.created) AS date
        ,   ROUND(tmn.ambient_temperature, 1)   AS min_temp
    FROM    weather_measurement tmn
    WHERE   MONTH(DATE(tmn.created)) = MONTH(NOW())
        AND EXISTS
            (   SELECT  NULL
                FROM    weather_measurement sel
                WHERE   MONTH(DATE(sel.created)) = MONTH(DATE(tmn.created))
                HAVING  MIN(ROUND(sel.ambient_temperature, 1))  = ROUND(tmn.ambient_temperature, 1)
            )
    ;
    La requête pour le maximum en découle naturellement.
    C'est l'une des manières de faire, d'autres requêtes permettent d'obtenir le même résultat.

    Une règle complémentaire reste à définir : quelle date retenir si ces extrêmes apparaissent plusieurs fois dans le mois ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Attention au filtre sur le mois : si votre table contient plusieurs années de données, il y aura un mélange (le minimum du mois de mai 2014, avec le maximum du mois de mai 2015 par exemple)

    Il serait préférable de remplacer ce filtre en calculant la date de début et la date de fin de mois, ce qui en plus favoriserait l'utilisation d'index, impossible avec votre filtre actuel.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    merci à tous les deux !

    @aieeeuuuuu : j'ai pas tout saisi, pourrais tu me donner des pistes supplémentaires, en ce moment la base de données a moins d'un an, donc le problème ne se pose pas, mais tu as raison, il devrait se poser et autant faire les choses bien tout de suite...

    @al1_24 : ta requête fonctionne bien, mais je n'avais pas pensé à des temperatures minimum identiques, comment ferais-tu ?

    merci encore de vous être penché sur ma demande

    jerome

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour le regroupement par année, ce n'est pas bien compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  DATE(tmn.created)                   AS date
        ,   ROUND(tmn.ambient_temperature, 1)   AS min_temp
    FROM    weather_measurement tmn
    WHERE   MONTH(DATE(tmn.created)) = MONTH(NOW())
        AND YEAR(DATE(tmn.created))  = YEAR(NOW())
        AND EXISTS
            (   SELECT  NULL
                FROM    weather_measurement sel
                WHERE   MONTH(DATE(sel.created)) = MONTH(DATE(tmn.created))
                    AND YEAR(DATE(sel.created))  = YEAR(DATE(tmn.created))
                HAVING  MIN(ROUND(sel.ambient_temperature, 1))  = ROUND(tmn.ambient_temperature, 1)
            )
    ;
    Quant à déterminer quelle date choisir s'il y en a plusieurs qui répondent à la sélection, c'est une règle à définir en fonction du besoin. Le plus souvent, on prend la plus ancienne ou la plus récente. Mais ça reste un choix fonctionnel, pas technique.
    Exemple avec la plus récente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  MIN(DATE(tmn.created))              AS date
        ,   ROUND(tmn.ambient_temperature, 1)   AS min_temp
    FROM    weather_measurement tmn
    WHERE   ...
    GROUP BY ROUND(tmn.ambient_temperature, 1)
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            default character set `latin1`
            default collate       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `WEATHER_MEASUREMENT`
    --------------
     
    --------------
    CREATE TABLE `WEATHER_MEASUREMENT`
    ( `id`                   integer  unsigned not null auto_increment primary key,
      `ambient_temperature`  decimal(15,3)     not null,
      `created`              datetime          not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `WEATHER_MEASUREMENT` (`ambient_temperature`,`created`) value
      ( 9.225, '2016-04-01 05:00:01'),
      (12.325, '2016-04-02 15:00:02'),
      ( 8.425, '2016-04-03 04:25:03'),
      (15.525, '2016-04-04 16:17:04'),
      (12.625, '2016-05-05 15:25:05'),
      (25.725, '2016-05-06 17:33:06'),
      (11.825, '2016-05-07 09:11:07'),
      (10.925, '2016-06-08 12:09:08'),
      (14.125, '2016-06-09 14:17:09'),
      (28.025, '2016-06-10 15:45:10'),
      (25.125, '2016-07-11 14:58:11'),
      (32.225, '2016-07-12 14:42:12'),
      (26.325, '2016-07-13 15:13:13'),
      (33.425, '2016-07-14 13:28:14')
    --------------
     
    --------------
    select * from WEATHER_MEASUREMENT
    --------------
     
    +----+---------------------+---------------------+
    | id | ambient_temperature | created             |
    +----+---------------------+---------------------+
    |  1 |               9.225 | 2016-04-01 05:00:01 |
    |  2 |              12.325 | 2016-04-02 15:00:02 |
    |  3 |               8.425 | 2016-04-03 04:25:03 |
    |  4 |              15.525 | 2016-04-04 16:17:04 |
    |  5 |              12.625 | 2016-05-05 15:25:05 |
    |  6 |              25.725 | 2016-05-06 17:33:06 |
    |  7 |              11.825 | 2016-05-07 09:11:07 |
    |  8 |              10.925 | 2016-06-08 12:09:08 |
    |  9 |              14.125 | 2016-06-09 14:17:09 |
    | 10 |              28.025 | 2016-06-10 15:45:10 |
    | 11 |              25.125 | 2016-07-11 14:58:11 |
    | 12 |              32.225 | 2016-07-12 14:42:12 |
    | 13 |              26.325 | 2016-07-13 15:13:13 |
    | 14 |              33.425 | 2016-07-14 13:28:14 |
    +----+---------------------+---------------------+
    --------------
    SELECT  DATE(tmn.created) AS date
        ,   ROUND(tmn.ambient_temperature, 1)   AS min_temp
    FROM    weather_measurement tmn
    WHERE   MONTH(DATE(tmn.created)) = MONTH(NOW())
        AND EXISTS
            (   SELECT  NULL
                FROM    weather_measurement sel
                WHERE   MONTH(DATE(sel.created)) = MONTH(DATE(tmn.created))
                HAVING  MIN(ROUND(sel.ambient_temperature, 1))  = ROUND(tmn.ambient_temperature, 1)
            )
    --------------
     
    +------------+----------+
    | date       | min_temp |
    +------------+----------+
    | 2016-05-07 |     11.8 |
    +------------+----------+
    --------------
    select 'min' as type, round(ambient_temperature,1) as temp, created as date
    from WEATHER_MEASUREMENT
    where ambient_temperature = (
     
      select min(ambient_temperature)
      from WEATHER_MEASUREMENT
      where created between date_format(now(), '%Y-%m-01') and last_day(now())
      group by month(created)
    )
     
    union
     
    select 'max' as type, round(ambient_temperature,1) as temp, created as date
    from WEATHER_MEASUREMENT
    where ambient_temperature = (
     
      select max(ambient_temperature)
      from WEATHER_MEASUREMENT
      where created between date_format(now(), '%Y-%m-01') and last_day(now())
      group by month(created)
    )
    --------------
     
    +------+------+---------------------+
    | type | temp | date                |
    +------+------+---------------------+
    | min  | 11.8 | 2016-05-07 09:11:07 |
    | max  | 25.7 | 2016-05-06 17:33:06 |
    +------+------+---------------------+
    --------------
    commit
    --------------
     
    --------------
    set autocommit = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    merci à tous pour vos réponses, elles fonctionnent toutes
    cependant celle d'Artemus24 semble un peu plus rapide
    je ne connaissais pas type.

    Maintenant je suis embêté car je n'arrive pas à faire un echo sur l'une ou l'autre des températures pour les inclure dans une page php. une piste ?
    cela me renvoie les deux données, j'aimerai seulement l'une puis l'autre

    une fois de plus je suis un peu limité mais j'ai encore appris des choses aujourd'hui

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut JEROMECHR.

    Vous ne savez pas récupérer les lignes indépendamment d'une boucle dans votre traitement en php. Est-ce bien cela ?

    Vous avez le choix entre faire deux requêtes, l'une qui correspond au "min" (la première partie de l'union) et l'autre qui correspond au "max" (la seconde partie de l'union).
    Cela va répondre à votre attente.

    Ou bien, vous utilisez la requête avec l'union. Sachant que vous avez seulement deux lignes, alors ne faites pas de boucle !
    La première ligne récupère le "min" et la seconde ligne le "max".

    Est-ce que vous utilisez le "pdo mysql" ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    merci
    en fait je démarrre, je fais partie d'un projet de la fondation raspberry qui offre à des écoles dans le monde une station météo.
    Je ne suis que prof des écoles donc mes connaissances en php mysql sont un peu limitées mais je progresse

    je sais déjà faire des requêtes simples dans une bdd, mais là je ne sais pas pourquoi ça ne veut pas marcher, j'ai une page planche. Soit je suis fatigué soit je suis vraiment nul

    voilà ce que je fais :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd = new PDO('mysql:host=localhost;dbname=weather;charset=utf8', 'root', 'pwd');

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse = $bdd->query("ton exemple de requête")

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($donnees = $reponse->fetch())

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {
    echo ($donnees['min']);
    }

    d'habitude ça fonctionne, mais là ???

    merci

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut JEROMECHR.

    Quel est la version de votre raspberry pi ?

    Voici un exemple qui fonctionne avec votre requête :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    <!doctype html>
    <html>
    <head>
    <meta charset="ISO-8859-1" />
    <title>Test Php/MySql !</title>
     
    <link rel="stylesheet" type="text/css" href="Css/Styles.css">
    </head>
     
    <body>
    <h1>Test d'utilisation Php / MySql !</h1>
    <pre>
    <?php
    require_once("Php/MySql_In.php");
     
    /*----------------------------------*/
    /* Initialisation du fuseau horaire */
    /*----------------------------------*/
     
    date_default_timezone_set("Europe/Paris");
     
    /*------------------------------*/
    /* lien vers la base de données */
    /*------------------------------*/
     
    try {
        $sql = $link->exec("use basephp;");
    }
    catch ( Exception $e )
    {
    	echo "Une erreur est survenue dans la définition de la base : ", $e->getMessage();
    	die();
    }
     
    /*--------*/
    /* Vidage */
    /*--------*/
     
    try {
        $sel = $link->query("select 'min' as type, round(ambient_temperature,1) as temp, created as date from WEATHER_MEASUREMENT where ambient_temperature = (
    
      select min(ambient_temperature) from WEATHER_MEASUREMENT where created between date_format(now(), '%Y-%m-01') and last_day(now())  group by month(created)
    )
    
    union
    
    select 'max' as type, round(ambient_temperature,1) as temp, created as date from WEATHER_MEASUREMENT where ambient_temperature = (
    
      select max(ambient_temperature) from WEATHER_MEASUREMENT where created between date_format(now(), '%Y-%m-01') and last_day(now()) group by month(created)
    )");
    }
    catch ( Exception $e )
    {
    	echo "Une erreur est survenue durant le vidage de 'lien'  : ", $e->getMessage();
    	die();
    }
     
    printf("+-----------------------------------+\n");
    printf("|        WEATHER MEASUREMENT        |\n");
    printf("+------+------+---------------------+\n");
    printf("| Type | Temp |       Created       |\n");
    printf("+------+------+---------------------+\n");
     
    try {
    	while ($row = $sel->fetch(PDO::FETCH_ASSOC))
    	{
    		printf("|%5s |%5s |%20s |\n", $row['type'], $row['temp'], $row['date']);
    	}
    }
    catch ( Exception $e )
    {
    	echo "Une erreur est survenue durant l'affichage des résultats : ", $e->getMessage();
    	die();
    }
     
    printf("+------+------+---------------------+\n");
     
    /*------------------*/
    /* Fermeture Cursor */
    /*------------------*/
     
    $sel->closeCursor();
     
    require_once("Php/MySql_Out.php");
    ?>
    </pre>
    </body>
    </html>
    Et voici le résultat :
    Test d'utilisation Php / MySql !
    +-----------------------------------+
    |        WEATHER MEASUREMENT        |
    +------+------+---------------------+
    | Type | Temp |       Created       |
    +------+------+---------------------+
    |  min | 11.8 | 2016-05-07 09:11:07 |
    |  max | 25.7 | 2016-05-06 17:33:06 |
    +------+------+---------------------+
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Salut,
    merci pour ton aide, j'ai un peu modifié ton conseil pour l'adapter à ma page. et ça fonctionne nickel !
    J'ai aussi fait un test pour faire la même chose sur l'année. J'attends qu'on change de mois pour voir si j'ai été efficace.

    Le pi fourni par la fondation Raspberry est un 2 !

    merci encore !

    jerome

  12. #12
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut JEROMECHR.

    Citation Envoyé par JEROMECHR
    j'ai une raspberry pi qui log des données météo dans une base
    Citation Envoyé par JEROMECHR
    je fais partie d'un projet de la fondation raspberry qui offre à des écoles dans le monde une station météo.
    Je ne suis que prof des écoles donc mes connaissances en php mysql sont un peu limitées mais je progresse
    Est-ce que vous suivez un stage pour vous familiarisé avec votre Raspberry Pi 2 ?

    Dans le cadre de vos cours, qu'est-ce que vous devez faire avec vos élèves ?
    C'est pour les initier à la programmation ?
    Et vos élèves sont dans quelle classe ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    bonjour, je suis un peu familiarisé avec le pi en ayant 2 délà, mais je ne connaissais pas mysql, j'ai seulement quelques bases avec python, et il y a tellement de projets dont on peut s'inspirer.

    sinon pas de formation prévue pour les profs de primaire, on se forme un peu tout seul..

    Le projet météo est un peu compliqué pour mes élèves de 10 ans (c'est plutôt destiné aux collégiens), mais ils ont fait quelques trucs, la bannière du site web, quelques pages html, étude de certains capteurs et en parallèle un peu de python pour utiliser des leds, boutons et autres.
    Ces activités se font sur le temps libre, et le but est leur apprendre un peu à programmer, leur donner envie de faire des choses différentes. Et je suis aussi intéressé par le sujet même si j'ai beaucoup de choses à apprendre.

    Une fois la station installée, il y aura plein de choses à faire ...

    merci encore pour ton aide

    jerome

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bonjour
    je reviens vers vous car cela ne fonctionne pas vraiment comme prévu.

    POur reprendre depuis le début : voici base de données "weather"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE WEATHER_MEASUREMENT(
      ID BIGINT NOT NULL AUTO_INCREMENT,
      REMOTE_ID BIGINT,
      AMBIENT_TEMPERATURE DECIMAL(6,2) NOT NULL,
      GROUND_TEMPERATURE DECIMAL(6,2) NOT NULL,
      AIR_QUALITY DECIMAL(6,2) NOT NULL,
      AIR_PRESSURE DECIMAL(6,2) NOT NULL,
      HUMIDITY DECIMAL(6,2) NOT NULL,
      WIND_DIRECTION DECIMAL(6,2) NULL,
      WIND_SPEED DECIMAL(6,2) NOT NULL,
      WIND_GUST_SPEED DECIMAL(6,2) NOT NULL,
      RAINFALL DECIMAL (6,2) NOT NULL,
      CREATED TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      );


    j'ai essayé avec l'aide d'Artemus notamment d'afficher sur une page , les données max et min pour le mois en cours et l'année en cours avec les dates .

    on peut voir la page en question ici temp-flixecourt.ddns.net:1800/demo/index/current.php

    voici les scripts en question pour le mois et l'année, je précise que cela "semblait marcher" jusquà ce qu'on change de mois :
    pour le mois : https://drive.google.com/file/d/0B58...ew?usp=sharing

    pour l'année : https://drive.google.com/file/d/0B58...ew?usp=sharing

    une extraction de la table en csv : https://drive.google.com/open?id=0B5...Xh5SHUyU0JrMDg

    merci d'avance pour vos suggestions !

    je rappelle qu'il s'agit d'un projet pour une école primaire, donc dur dur pour les élèves et leur professeur !

  15. #15
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Jérome.

    En regardant le fichier au format ".csv", il y a plusieurs points qui ne vont pas :

    1) la colonne "created" ne te sert à rien car tu as aussi les colonnes "date" "time" ?

    2) la date n'est pas dans le bon format de présentation.
    C'est "YYYY-MM-DD" sous MySql et non sous le format "DD/MM/YYYY".

    3) comme je te l'ai dit précédemment, évite pour les noms de tes colonnes d'utiliser des mots réservés.

    4) utilises aussi des noms courts pour les noms de tes colonnes, voire aussi le nom de tes tables.
    Un mot significatif suffit largement. Le tout est qu'il soit unique dans toute ta base de données.

    5) par la suite, on verra pour ce qui concerne le php.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse :
    en fait je pense que le fichier csv est une "transformation" de ma base :

    1/ je suis obligé d'utiliser DATE(CREATED) pour mes requêtes de date car la requête "date" me renvoie une erreur "colonne inconnue"

    2/ quand je fais une requête mysql, la date est bien au format YYYY-MM-DD

    3-4/j'ai du utiliser ces noms car le pi log aussi sur une base de données oracle distante qui doit utiliser ces noms

    je ne sais pas si je suis clair

    un dump de ma base de données :https://drive.google.com/file/d/0B58...ew?usp=sharing

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    en fait le problème c'est d'avoir la date de la valeur
    car sans date ça fonctionne, j'ai les bonnes valeurs :
    temp-flixecourt.ddns.net:1800/demo/relevemois2.php

    temp-flixecourt.ddns.net:1800/demo/annee2.php

  18. #18
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut JéromeChr.

    J'ai refais le test du chargement. Voici ce que j'ai pu faire :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `measurement`
    --------------
     
    --------------
    CREATE TABLE `measurement`
    ( `id`         bigint unsigned   not null AUTO_INCREMENT,
      `remote`     bigint unsigned   not null,
      `ambient`    DECIMAL(6,2)      not null,
      `ground`     DECIMAL(6,2)      not null,
      `quality`    DECIMAL(6,2)      not null,
      `pressure`   DECIMAL(6,2)      not null,
      `humidity`   DECIMAL(6,2)      not null,
      `direction`  DECIMAL(6,2)      not null,
      `speed`      DECIMAL(6,2)      not null,
      `rafale`     DECIMAL(6,2)      not null,
      `chute`      DECIMAL(6,2)      not null,
      `annee`      smallint unsigned not null,
      `mois`       integer  unsigned not null,
      `jour`       date              not null,
      `heure`      time              not null,
      primary key         (`jour`,`heure`,`id`),
             index `idx1` (`annee`),
             index `idx2` (`mois`),
      unique index `idx3` (`id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    LOAD DATA LOCAL INFILE 'weather.txt'
         INTO TABLE `measurement`
         CHARACTER SET latin1
         FIELDS TERMINATED            BY ','
                OPTIONALLY ENCLOSED   BY '"'
                ESCAPED               BY '\\'
         LINES  TERMINATED            BY '\r\n'
         IGNORE 1 LINES
         (@dummy, remote, @ambient, ground, quality, pressure, humidity, direction, speed, rafale, chute, @datime, @dummy, @dummy)
         set ambient =            round(@ambient,1),
                 annee   =             year(@datime),
             jour    =             date(@datime),
             heure   =             time(@datime),
             mois    = cast(date_format(@datime, '%Y%m') as unsigned)
    --------------
     
    --------------
    alter table measurement order by jour, heure, id
    --------------
     
    --------------
    OPTIMIZE NO_WRITE_TO_BINLOG TABLE measurement
    --------------
     
    +------------------+----------+----------+----------+
    | Table            | Op       | Msg_type | Msg_text |
    +------------------+----------+----------+----------+
    | base.measurement | optimize | status   | OK       |
    +------------------+----------+----------+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Et voici la recherche du minimum et du maximum par période :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    --------------
    explain
    select jour, 'jour'   as type, min(ambient) as min, max(ambient) as max
    from  MEASUREMENT
    group by jour
    --------------
     
    +----+-------------+-------------+------------+-------+------------------------+---------+---------+------+------+----------+-------+
    | id | select_type | table       | partitions | type  | possible_keys          | key     | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-------------+------------+-------+------------------------+---------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | MEASUREMENT | NULL       | index | PRIMARY,idx3,idx1,idx2 | PRIMARY | 14      | NULL | 2939 |   100.00 | NULL  |
    +----+-------------+-------------+------------+-------+------------------------+---------+---------+------+------+----------+-------+
    --------------
    explain
    select mois, 'mois'   as type, min(ambient) as min, max(ambient) as max
    from  MEASUREMENT
    group by mois
    --------------
     
    +----+-------------+-------------+------------+-------+---------------+------+---------+------+------+----------+-------+
    | id | select_type | table       | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-------------+------------+-------+---------------+------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | MEASUREMENT | NULL       | index | idx2          | idx2 | 4       | NULL | 2939 |   100.00 | NULL  |
    +----+-------------+-------------+------------+-------+---------------+------+---------+------+------+----------+-------+
    --------------
    explain
    select annee, 'annee' as type, min(ambient) as min, max(ambient) as max
    from  MEASUREMENT
    group by annee
    --------------
     
    +----+-------------+-------------+------------+-------+---------------+------+---------+------+------+----------+-------+
    | id | select_type | table       | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-------------+------------+-------+---------------+------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | MEASUREMENT | NULL       | index | idx1          | idx1 | 2       | NULL | 2939 |   100.00 | NULL  |
    +----+-------------+-------------+------------+-------+---------------+------+---------+------+------+----------+-------+
    --------------
    select jour, 'jour'   as type, min(ambient) as min, max(ambient) as max
    from  MEASUREMENT
    group by jour
    --------------
     
    +------------+------+-------+-------+
    | jour       | type | min   | max   |
    +------------+------+-------+-------+
    | 2016-04-25 | jour | 20.80 | 22.30 |
    | 2016-04-27 | jour | 18.70 | 18.70 |
    | 2016-04-28 | jour | 22.70 | 22.70 |
    | 2016-04-29 | jour | 21.90 | 21.90 |
    | 2016-04-30 | jour | 22.00 | 22.00 |
    | 2016-05-01 | jour | 23.00 | 23.10 |
    | 2016-05-16 | jour | 17.80 | 24.20 |
    | 2016-05-17 | jour | 17.90 | 19.00 |
    | 2016-05-21 | jour | 18.70 | 21.10 |
    | 2016-05-22 | jour | 17.90 | 25.60 |
    | 2016-05-24 | jour | 19.20 | 43.00 |
    | 2016-05-25 | jour | 18.50 | 20.00 |
    | 2016-05-26 | jour | 19.00 | 21.10 |
    | 2016-05-27 | jour | 20.70 | 22.50 |
    | 2016-05-28 | jour | 21.40 | 23.20 |
    | 2016-05-29 | jour | 21.60 | 22.40 |
    | 2016-05-30 | jour | 21.00 | 22.50 |
    | 2016-05-31 | jour | 20.00 | 21.30 |
    | 2016-06-01 | jour | 19.50 | 20.50 |
    +------------+------+-------+-------+
    --------------
    select mois, 'mois'   as type, min(ambient) as min, max(ambient) as max
    from  MEASUREMENT
    group by mois
    --------------
     
    +--------+------+-------+-------+
    | mois   | type | min   | max   |
    +--------+------+-------+-------+
    | 201604 | mois | 18.70 | 22.70 |
    | 201605 | mois | 17.80 | 43.00 |
    | 201606 | mois | 19.50 | 20.50 |
    +--------+------+-------+-------+
    --------------
    select annee, 'annee' as type, min(ambient) as min, max(ambient) as max
    from  MEASUREMENT
    group by annee
    --------------
     
    +-------+-------+-------+-------+
    | annee | type  | min   | max   |
    +-------+-------+-------+-------+
    |  2016 | annee | 17.80 | 43.00 |
    +-------+-------+-------+-------+
     
    Appuyez sur une touche pour continuer...
    Si tu désires sélectionner que le jour, tu ajoutes :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    where jour = date(now())
    pour le mois :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    where mois = cast(date_format(now(), '%Y%m') as unsigned)
    et pour l'année :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    where annee = year(now())

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    en fait je ne suis pas sur de comprendre
    dois-je utiliser une autre base de données ? modifier l'existante ?

    autant que faire se peut, si c'est possible, j'aimerai utiliser ma base de données existantes(beaucoup de choses s'y rapportent et ça fonctionne pas mal).
    Si c'est possible, puis-je modifier pour adapter tes réponses à ma situation ?

    merci encore

  20. #20
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut JéromeChr.

    1) il manque des colonnes dans la base de données afin d'obtenir des bonnes performances. Par exemple les colonnes année et mois.

    2) il manques des index afin d'accélérer les performances : idx1, idx2, idx3.

    3) faire en sorte que les lignes de votre table soient dans l'ordre des jours et des heures.

    4) si vous n'utilisez pas toutes les colonnes, il est inutile de les mettre.

    5) comment chargez-vous votre table "WEATHER_MEASUREMENT" ?
    Est-ce par un "load data local infile ?

    6) dans mon exemple, j'ai fait en sorte de remplir les colonnes en fonction du fichier contenant les données à charger.
    Là où il y a "@dummy", cela signifie que je n'en tiens pas compte.

    Citation Envoyé par JéromeChr
    j'aimerai utiliser ma base de données existantes(beaucoup de choses s'y rapportent et ça fonctionne pas mal).
    Qu'est-ce qui s'y rapporte ? Vous parlez peut-être de son chargement ? Ou d'autre chose ?

    Citation Envoyé par JéromeChr
    Si c'est possible, puis-je modifier pour adapter tes réponses à ma situation ?
    Vous faites ce que vous voulez. Je suis juste là pour vous aider, dans la mesure où vous suivez mes conseils.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. excel Somme en fonction d'un mois et d'une année
    Par zaza45 dans le forum Excel
    Réponses: 7
    Dernier message: 24/04/2008, 13h22
  2. Réponses: 2
    Dernier message: 07/06/2007, 16h28
  3. aidez moi j'ai un pb avec la date merci
    Par anilane dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/05/2007, 14h35
  4. Selectionner une balise avec un attribut ayant deux valeur
    Par lemok dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/05/2007, 17h25
  5. Réponses: 3
    Dernier message: 20/09/2006, 16h07

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