Wiliwilliam | SQL aide GROUP [RESOLVU] |
2 #1 |
---|---|---|
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38311
Karma: 19037 |
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): 38311
Karma: 19037 |
@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): 38311
Karma: 19037 |
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): 38311
Karma: 19037 |
@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:
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 :
Et pour le passage d'un timestamp à un champ DATETIME, tu peux l'automatiser facilement
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): 38311
Karma: 19037 |
Citation :
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 :
Ou aussi (mais moins performante que la précédente) : Citation :
Contribution le : 13/02/2018 20:45
|
|
_________________
|
||
Signaler |
Wiliwilliam | 0 #11 |
|
---|---|---|
La loi c'est moi
Inscrit: 07/04/2012 19:19
Post(s): 38311
Karma: 19037 |
@-Flo-
je suis pas sur d'avoir compris le
1,2,3 ce sont les ID respectifs de YEAR(ts), MONTH(ts), DAY(ts) ? ça évite de faire
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): 38311
Karma: 19037 |
et bah j'en apprends tous les jours
ç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 |