Videos streaming images jeux et buzz
Connexion






Perdu le mot de passe ?

Inscrivez-vous maintenant !
Menu Principal
Communauté




Wiliwilliam
SQL aide GROUP [RESOLVU]
 2  #1
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
Salut j'ai besoin d'un coup de main sur la construction d'une requête et sa logique.

J'ai une BDD avec une colonne [timestamp] et une colonne [Nombre]
chaque ligne est ajoutée toutes les heures avec le timestamp et une valeur.

J'aimerais pouvoir faire des requêtes en groupant les valeurs par période sur une période.

la requête la plus simple: les valeurs toutes les heures sur les dernières 24h:
SELECT * FROM BDD ORDER BY timestamp DESC LIMIT 24;

Mais j'ai un peu plus de mal quand il s'agit de faire une requête du style: les valeurs tous les jours sur les 20 derniers jours
ou encore: les valeurs tous les mois sur les 365 derniers jours.

Est-ce que quelqu'un pourrait m'éclairer? je me doute que je vais devoir utiliser l'option GROUP mais j'ai du mal à comprendre comment je pourrais faire avec le timestamp (le timestamp c'est bêtement le time() du PHP, pas le timestamp au format SQL)

Contribution le : 13/02/2018 12:15
_________________
>> Récompenses si tu passes en article <<
Signaler

CrazyCow
 2  #2
Je poste trop
Inscrit: 29/07/2008 00:26
Post(s): 18991
Karma: 29871
C'est une base de données MySQL ou SQL Server ?

C'est obligatoire d'avoir le timestamp et pas un DATETIME (qui serait plus simple à utiliser pour des requêtes sur des intervalles de temps) ?

En MySQL, tu peux facilement afficher un timestamp dans ta requête, tout en stockant l'information en DATETIME, grâce à la fonction UNIX_TIMESTAMP().

Contribution le : 13/02/2018 12:29
_________________
🏆🏆 K TROPHY
À un moment donné, il faut lâcher prise. Claude François
Signaler

akrogames
 1  #3
Je masterise !
Inscrit: 04/02/2014 12:29
Post(s): 2273
Karma: 430
Coucou,
C'est quoi la base de données?

Si c'est MySQL, tu peux faire ça, garde les timestamp car de toute façon c'est pas un problème, au pire tu fais comme a dit Crazycow c'est aussi une bonne idée.

Exemple: les valeurs tous les jours sur les 20 derniers jours:
SELECT Nombre
FROM mytable
WHERE timestamp >= NOW() - INTERVAL 1 DAY
AND (( tu limites a 20 jours

Désolé j'ai pas le temps de finir, je dois y aller.

Contribution le : 13/02/2018 12:53
_________________
La civilisation humaine n'est que chaos.
Signaler

Wiliwilliam
 0  #4
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
@CrazyCow je peux changer... je pense... uniquement si je peux transformer le datetime en timestamp car je fais des operations de soustractions sur les timestamp.
Mais du coup ça donnerait quoi avec le format datetime?
(Va falloir que je potasse :/)

Contribution le : 13/02/2018 15:02
_________________
>> Récompenses si tu passes en article <<
Signaler

CrazyCow
 1  #5
Je poste trop
Inscrit: 29/07/2008 00:26
Post(s): 18991
Karma: 29871
@Wiliwilliam

Ça ressemblerait à quelque chose comme ça :



(D'autres auront peut-être un meilleur avis sur la question que moi, mais je pense que ce sera plus pratique en DATETIME qu'en timestamp)

Contribution le : 13/02/2018 15:11
_________________
🏆🏆 K TROPHY
À un moment donné, il faut lâcher prise. Claude François
Signaler

Wiliwilliam
 2  #6
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
Wokay, je vais tester cette construction et voir un peu comment ça réagit.

Merci beaucoup

Contribution le : 13/02/2018 15:18
_________________
>> Récompenses si tu passes en article <<
Signaler

Wiliwilliam
 0  #7
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
@CrazyCow



#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'bdd.test.ts' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

j'ai regardé sur stackoverflow des erreurs similaires mais je comprends pas bien ce que racontent les mecs.
Y a un commentaire assez clair qui explique l'option ONLY_FULL_GROUP_BY mais je vois pas en quoi ça concerne mes types de requêtes

EDIT:
SELECT ts,SUM(v)as total
FROM test
WHERE ts BETWEEN "2018-02-13 00:00:00" AND "2018-02-01 00:00:00"
GROUP BY YEAR(ts),MONTH(ts),DAY(ts),total
ORDER BY ts DESC

Ne marche pas non plus. 😞 j'ai lu qu'il était suggéré de group toutes les colonnes qui étaient en SELECT... mais visiblement ça n'aide pas vraiment


EDIT 2:
@CrazyCow
j'ai trouvé 😃
bon je suis con en fait, j'avais rien compris à ce que disait le mec.
la bonne requête:
SELECT DAY(ts),SUM(v)
FROM test
WHERE ts
BETWEEN "2018-02-10 00:00:00"
AND "2018-02-13 00:00:00"
GROUP BY YEAR(ts),MONTH(ts),DAY(ts)
ORDER BY DAY(ts) ASC


la nuance c'est le DAY(ts) dans le select et le order by.
Ben oui, c'est le résultat final que j'ordonne et c'est effectivement le DAY(ts) que je récupère. Bref merci beaucoup pour ton aide crazycow 😃 tu fais chier je vais devoir reconstruire ma base de donner >_<

Contribution le : 13/02/2018 17:44
_________________
>> Récompenses si tu passes en article <<
Signaler

CrazyCow
 2  #8
Je poste trop
Inscrit: 29/07/2008 00:26
Post(s): 18991
Karma: 29871
@Wiliwilliam

👍

Si ta sélection tu ne la fais que sur quelques jours ça ira, par contre si elle se fait sur plus de 30 jours j'ai peur que ça ne s'affiche pas dans le bon ordre (il se basera uniquement sur le numéro du jour).

Je le ferais de la façon suivante :

SELECT DATE_FORMAT(ts, "%Y-%m-%d") as dayts, SUM(v)
FROM test
WHERE ts
BETWEEN "2018-02-10 00:00:00"
AND "2018-02-13 00:00:00"
GROUP BY dayts
ORDER BY dayts ASC



Et pour le passage d'un timestamp à un champ DATETIME, tu peux l'automatiser facilement 😉

UPDATE table
SET colonne_datetime = FROM_UNIXTIME(colonne_timestamp)



EDIT 18h46 : Requête SQL simplifiée.

Contribution le : 13/02/2018 18:37
_________________
🏆🏆 K TROPHY
À un moment donné, il faut lâcher prise. Claude François
Signaler

Wiliwilliam
 1  #9
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
Citation :

@CrazyCow a écrit:
UPDATE table
SET colonne_datetime = FROM_UNIXTIME(colonne_timestamp)



gniiiiiiiiiiiiiiii


Trop tard 😃
Pas grave rien de très important!
Je garde ce topic en fav'

Contribution le : 13/02/2018 18:40
_________________
>> Récompenses si tu passes en article <<
Signaler

-Flo-
 2  #10
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15190
Karma: 12562
@Wiliwilliam Autres solutions possibles :

Ma préférée, pour rester dans l'esprit de ta première tentative :

Citation :

SELECT YEAR(ts), MONTH(ts), DAY(ts), SUM(v)
FROM test
WHERE ts BETWEEN '2018-02-10' AND '2018-02-13'
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3


Ou aussi (mais moins performante que la précédente) :

Citation :

SELECT LEFT(ts, 10), SUM(v)
FROM test
WHERE ts BETWEEN '2018-02-10' AND '2018-02-13'
GROUP BY 1
ORDER BY 1

Contribution le : 13/02/2018 20:45
_________________
Signaler

Wiliwilliam
 0  #11
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
@-Flo-
je suis pas sur d'avoir compris le
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3


1,2,3 ce sont les ID respectifs de YEAR(ts), MONTH(ts), DAY(ts) ?

ça évite de faire
GROUP BY YEAR(ts), MONTH(ts), DAY(ts)
ORDER BY YEAR(ts), MONTH(ts), DAY(ts)


du style : SELECT YEAR(ts)(AS 1), MONTH(ts)(AS 2), DAY(ts)(AS 3)
?

Contribution le : 13/02/2018 21:19
_________________
>> Récompenses si tu passes en article <<
Signaler

-Flo-
 1  #12
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15190
Karma: 12562
Oui, exactement !

Contribution le : 13/02/2018 21:22
_________________
Signaler

Wiliwilliam
 0  #13
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38209
Karma: 18936
et bah j'en apprends tous les jours
ipfs QmYdQLEVvPRf6uRzKD4M5f5LeScRDS1PeEqKXDMYDoDMjj
ça va alléger pas mal de mes futurs requêtes en terme de longueur.
😃 Merci!

Contribution le : 13/02/2018 21:24
_________________
>> Récompenses si tu passes en article <<
Signaler

-Flo-
 0  #14
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15190
Karma: 12562
En général on l'évite dans le code, ça peut être une source d'erreur bête si tu fais évoluer ta requête en ajoutant des champs. C'est surtout pratique pour des requêtes à la main, pour aller plus vite.

Ce n'était pas vraiment ça l'objet de ma réponse, mais plutôt le fait que ta démarche était bonne, à ceci près qu'il fallait simplement indiquer dans le select les 3 fonctions sur lesquelles tu effectuais ton group by, pour ne pas perdre la chronologie.

Contribution le : 13/02/2018 21:28
_________________
Signaler


 Haut   Précédent   Suivant






Si vous êtes l'auteur d'un élément de ce site, vous pouvez si vous le souhaitez, le modifier ou le supprimer
Merci de me contacter par mail. Déclaré à la CNIL N°1031721.