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

PHP & Base de données Discussion :

Condition qui ne fonctionne pas PHP


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Condition qui ne fonctionne pas PHP
    Bonjour,
    J'ai un requête avec INNER JOIN avec deux conditions. j'ai testé ma requête sur phpAdmin une de mes conditions fonctionne, mais l'autre non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT T1.*, sum(T2.pluie_jour) AS cumul FROM minimaxiarchive AS T1 INNER JOIN minimaxiarchive AS T2 ON T2.periode <= T1.periode WHERE T2.tstamp > '1672527600' AND T2.tstamp <= '1703977200' GROUP BY T1.tstamp ';
    La première condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T2.tstamp > '1672527600'
    fonctionne 1672527600 = 1 janvier 2023, par contre la deuxième ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T2.tstamp <= '1703977200'
    1703977200 = 31 janvier 2023.
    Ma requête commence bien le 1 janvier 2023, mais elle ne s'arrête pas au 31 décembre 2023, elle s'arrête au jour en cours.
    Quelqu'un aurait-il une idée du problème?

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    SELECT T1.*, sum(T2.pluie_jour) AS cumul
    FROM minimaxiarchive AS T1
    INNER JOIN minimaxiarchive AS T2 ON T2.periode <= T1.periode
    WHERE T2.tstamp > '1672527600' AND T2.tstamp <= '1703977200'
    GROUP BY T1.tstamp;
    On évite les SELECT * => Nomme toutes les colonnes désirées (surtout avec un GROUP BY)

    tstamp est un timestamp et donc un numérique => Les ' sont inutiles pour délimiter ses valeurs

    Avec WHERE T2.tstamp > '1672527600' tu exclues le minuit de 01/01/2023, est-ce voulu ?

    Avec WHERE [...] AND T2.tstamp <= '1703977200' tu exclues tout ce qui suit le minuit de 31/12/2023 (ex. 31/12/2023 01:00:00 est exclu), est-ce voulu ?

    Ton groupement sur 1 seule colonne est suspect => Pour être sûr de ne pas se tromper on groupe toutes les colonnes non agrégées et on active l'option MySQL ONLY_FULL_GROUP_BY https://dev.mysql.com/doc/refman/8.0..._full_group_by

    Le fond du problème
    Tu filtres T2 dans le WHERE mais tu sélectionnes T1 dans ton SELECT, il est donc normal que le résultat ne soit pas celui attendu
    Je pourrai te donner une solution avec un jeu de données et le résultat attendu

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Merci pour les explications et pour le lien, mais un peu compliqué pour moi
    Non, ce n'est pas voulu, je veux les données du 01-01-2023 à 0h00 jusqu'au 31 décembre 2023 à 24h00.
    Que veux tu comme jeu de données et avec quel format

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    On évite les SELECT * => Nomme toutes les colonnes désirées (surtout avec un GROUP BY)
    C'est sûr que les SELECT *, c'est déconseillé, mais pourquoi surtout avec un GROUP BY ?

    Que veux tu comme jeu de données et avec quel format
    donne STP le DDL de la table minimaxiarchive (code SQL de create table minimaxiarchive et code SQL des insert (un export SQL, donc) )

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    On évite les SELECT * => Nomme toutes les colonnes désirées (surtout avec un GROUP BY)
    C'est sûr que les SELECT *, c'est déconseillé, mais pourquoi surtout avec un GROUP BY ?
    Pour faire simple, parce qu'il faut mentionner dans le GROUP BY toutes les colonnes non agrégées du SELECT.
    => Avec un SELECT * ça peut en faire beaucoup pour rien
    => Si le schéma évolue la requête peut ne plus fonctionner ou le résultat devenir erroné

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    Non, ce n'est pas voulu, je veux les données du 01-01-2023 à 0h00 jusqu'au 31 décembre 2023 à 24h00.
    Dans ce cas :

    WHERE tstamp >= UNIX_TIMESTAMP('2023-01-01 00:00:00') AND tstamp < UNIX_TIMESTAMP('2024-01-01 00:00:00')

    Ou :

    WHERE tstamp BETWEEN UNIX_TIMESTAMP('2023-01-01 00:00:00') AND UNIX_TIMESTAMP('2023-12-23 23:59:59')

    Ou :

    WHERE YEAR(FROM_UNIXTIME(tstamp)) = 2023

    Ou :

    WHERE FROM_UNIXTIME(tstamp, '%Y')) = 2023

    Dans ces 2 derniers cas prévoir un index fonctionnel si tu as beaucoup de lignes.

    https://dev.mysql.com/doc/refman/8.0...unix-timestamp

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Pour le WHERE, j'ai compris, mais par contre pour le SELECT *, un peu moins.
    Ce que j'aimerais pour le résultat de cette requête:
    Le 1 janvier somme 1 janvier
    Le 2 janvier somme 1 janvier + 2 janvier
    Le 3 janvier somme 1 janvier + 2 janvier + 3 janvier
    et ainsi de suite jusqu'au 31 décembre. la colonne pour la somme et la colonne pluie_jour.
    Voici ma table, les données vont du 1 janvier 2023 à ce jour.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    Très clair, merci Je propose :

    select all
        tstamp, pluie_jour, 
        from_unixtime(tstamp) as _debug_tstamp_as_date,
        sum(pluie_jour) over (order by tstamp asc) as cumul_courant_pluie_jour
    from minimaxiarchive
    where tstamp between unix_timestamp('2023-01-01 00:00:00') and unix_timestamp('2023-12-23 23:59:59');
    Ce qui va donner :

    tstamp		pluie_jour	_debug_tstamp_as_date	cumul_courant_pluie_jour	
    ------		----------	---------------------	------------------------
    1672614000	3		2023-01-01 23:00:00	3
    1672700400	0		2023-01-02 23:00:00	3
    1672786800	1.2		2023-01-03 23:00:00	4.2
    1672873200	1.4		2023-01-04 23:00:00	5.6
    ...
    1703199600	6.2		2023-12-21 23:00:00	883.2000000000004
    1703286000	1		2023-12-22 23:00:00	884.2000000000004
    1703372400	1.8		2023-12-23 23:00:00	886.0000000000003

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Je viens de testé la requête, elle fonctionne parfaitement, c'est tout à fait ce que je voulais.
    Merci beaucoup pour les explications et pour l'aide.

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Pourquoi :
    On évite les SELECT *
    https://www.developpez.net/forums/bl...iliser-select/

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

Discussions similaires

  1. Champs AUTO_INCREMENT qui ne fonctionne pas (PHP)
    Par shaoling dans le forum SQL
    Réponses: 8
    Dernier message: 20/07/2010, 15h16
  2. Condition qui ne fonctionne pas dans une page jsp
    Par Lopak dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 29/04/2010, 16h37
  3. condition qui ne fonctionne pas
    Par Invité(e) dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2010, 16h27
  4. Editeur qui ne fonctionne pas -php eclipse
    Par dedalios dans le forum Eclipse PHP
    Réponses: 0
    Dernier message: 19/02/2009, 14h41
  5. [vb.net] Condition qui ne fonctionne pas
    Par dyree dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/06/2006, 09h55

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