PHP/MYSQL 2x ORDER BY toepassen.

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Amarog
  • Registratie: Januari 2013
  • Laatst online: 15-08 17:08
Hoi allen,

ik raak maar niet uit het volgende probleem. Ik heb een table met 2 waardes, daar wordt ieder uur 1 row in toegevoegd.

Voorbeeld table:

TableHistory
-------------------
TIME | VALUE

Daar haal ik de gemiddelde value per dag uit met volgende select:

SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value FROM TableHistory GROUP BY date(from_unixtime(Time)) ORDER BY Dag DESC LIMIT 30;

Dat werkt perfect en prima om in een grafiek te gieten indien ik niet meer dan 30 dagen ver ga... Indien ik meer dan 30 dagen aan data heb dan stopt hij op dag 30... Logischerwijs met de LIMIT 30 ... Als ik de ORDER BY Dag ga omdraaien naar ASC dan toont hij mijn grafiek eigenlijk omgekeerd, dan toont hij wel de laatste 30 dagen maar begint hij bij de laatste dag... Dus loopt m'n grafiek omgekeerd...

Een beetje moeilijk uitgelegd, ik weet het, maar hopelijk snappen jullie het?

Nu zou ik dus mijn bovenste resultaat nogmaals moeten sorten zodat hij eigenlijk de laatste 30 dagen toont en deze oplopend toont op de "Dag". Dus ik wil logischerwijs eerst bijvoorbeeld 4 januari dan 5 janauari, ... En niet eerst 5 januari en dan 4 januari...

Ik heb me al zot lopen zoeken en alles al getracht maar het lukt me niet om dit recht te trekken. Het zal wel weer iets simpel zijn dat ik nog niet snap of niet gelijk zie maar op mijn eentje en met google lukt het me niet.

Enige hulp is dus zeker welkom!

Beste antwoord (via Amarog op 17-03-2018 22:03)


  • Wiebeltje
  • Registratie: Maart 2013
  • Laatst online: 09:12
Je kan met een WHERE clause je resultaten beperken tot die van de laatste 30 dagen. Heb je die LIMIT in principe ook niet meer nodig.

code:
1
2
3
4
5
SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value 
FROM TableHistory  
WHERE date(from_unixtime(Time)) > (NOW() - INTERVAL 30 DAY)
GROUP BY date(from_unixtime(Time))
ORDER BY Dag ASC;


Overigens is het netter om je datums als DATETIME field in je database te zetten dan hoef je ook niet lastig te doen met date(from_unixtime()). Sowieso kun je dan zelf makkelijk in de database ook lezen wat er staat.

Edit: @ACM Inderdaad, foutje met knippen / plakken. Heb het aangepast. Tnx!

[ Voor 12% gewijzigd door Wiebeltje op 31-01-2018 21:34 ]

Alle reacties


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • Wiebeltje
  • Registratie: Maart 2013
  • Laatst online: 09:12
Je kan met een WHERE clause je resultaten beperken tot die van de laatste 30 dagen. Heb je die LIMIT in principe ook niet meer nodig.

code:
1
2
3
4
5
SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value 
FROM TableHistory  
WHERE date(from_unixtime(Time)) > (NOW() - INTERVAL 30 DAY)
GROUP BY date(from_unixtime(Time))
ORDER BY Dag ASC;


Overigens is het netter om je datums als DATETIME field in je database te zetten dan hoef je ook niet lastig te doen met date(from_unixtime()). Sowieso kun je dan zelf makkelijk in de database ook lezen wat er staat.

Edit: @ACM Inderdaad, foutje met knippen / plakken. Heb het aangepast. Tnx!

[ Voor 12% gewijzigd door Wiebeltje op 31-01-2018 21:34 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wiebeltje schreef op woensdag 31 januari 2018 @ 20:13:
Je kan met een WHERE clause je resultaten beperken tot die van de laatste 30 dagen. Heb je die LIMIT in principe ook niet meer nodig.

code:
1
2
3
4
SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value 
FROM TableHistory GROUP BY date(from_unixtime(Time)) 
WHERE date(from_unixtime(Time)) > (NOW() - INTERVAL 30 DAY)
ORDER BY Dag ASC;
Die group by hoort niet op die plek... Verkeerd gekopieerd?

Als je niet weet hoeveel dagen er precies zijn is er nog wel e.e.a. mogelijk, maar zal je met geneste queries moeten werken. Bijvoorbeeld zoiets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 2x sorteren
SELECT * 
FROM
 (SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value 
  FROM TableHistory 
  GROUP BY Dag -- Er is geen reden die clause hier te herhalen
  ORDER BY Dag ASC LIMIT 30) as foo
ORDER BY Dag DESC;

-- Juiste subset bepalen en dan goed sorteren
SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value 
  FROM TableHistory 
  WHERE date(from_unixtime(Time)) IN (SELECT date(from_unixtime(Time)) as Dag
            FROM TableHistory GROUP BY Dag ORDER BY Dag ASC LIMIT 30)
  GROUP BY Dag
  ORDER BY Dag DESC LIMIT 30) as foo
ORDER BY Dag DESC;


Disclaimer: ik heb geen van je queries daadwerkelijk uitgeprobeerd.

Acties:
  • 0 Henk 'm!

  • Amarog
  • Registratie: Januari 2013
  • Laatst online: 15-08 17:08
Bedankt aan beide voor de vlugge respons. @Wiebeltje zijn methode doet het perfect.
En ik weet dat het mss netter is om alles als DATETIME in de database te zetten. Het is echter een oude gewoonte die ik nukkig weiger aan te passen... Ik gebruik véél code opnieuw en ja, vroeger stond alles in unixtime in mijn datases... Bij deze nog steeds niet aangepast.

Nogmaals dikke merci!

Acties:
  • 0 Henk 'm!

  • Amarog
  • Registratie: Januari 2013
  • Laatst online: 15-08 17:08
Eventjes terugkomen op dit hier.
Bestaat er een mogelijkheid dat ik ook de average value per maand van de laatste 30 maand kan weer geven?

code:
1
2
3
4
5
SELECT date(from_unixtime(Time)) as Dag, avg(Value) as Value 
FROM TableHistory  
WHERE date(from_unixtime(Time)) > (NOW() - INTERVAL 30 DAY)
GROUP BY date(from_unixtime(Time))
ORDER BY Dag ASC;


Dit werkt perfect om de gemiddelde waarde PER DAG weer te geven voor de laatste 30 dagen maar nu zou ik dit ook willen voor de gemiddelde waarde PER MAAND voor de laatste 30 maand.

Al wat zitten googlen maar het lukt me maar niet om dit klaar te krijgen...

Alvast bedankt voor enige hulp!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Kijk voor de grap eens welke date en time functies er zijn in MySQL.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Amarog
  • Registratie: Januari 2013
  • Laatst online: 15-08 17:08
Ik ben een google programmeur, ik moet dus alles gaan zoeken en ondervinden. Ik vond het niet onmiddellijk dus daarom kwam ik hier nog even langs daar ik met dit probleem al geholpen was.

Dat "kijk voor de grap..." gedoe vond ik ietwat misplaatst. Het hielp me ook niet. Ik ben gelijk maar blijven googlen en proberen.

Uiteindelijk gevonden wat ik zocht.

code:
1
2
3
SELECT AVG(`Value`) AS Value, YEAR(from_unixtime(Time)) AS Jaar, MONTH(from_unixtime(Time)) AS Maand 
FROM WalletHistoryEuro 
GROUP BY Jaar, Maand;


Toch bedankt voor de initiële hulp.

Acties:
  • +2 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik heb je hiermee beter geholpen dan wanneer ik het je voorgekauwd had. Ik gaf je een zoekterm en met die term heb je precies gevonden wat je nodig had. Je hebt er als programmeur honderd keer meer aan om te weten hoe je het antwoord op een vraag vindt dan om het blind aangereikt te krijgen.

De reden voor mijn "voor de grap" was domweg dat je al een functie uit die categorie gebruikte zonder dat het verder in je opkwam om uit te zoeken welke andere functies er zijn.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Amarog schreef op zaterdag 17 maart 2018 @ 22:03:
Ik ben een google programmeur, ik moet dus alles gaan zoeken en ondervinden. Ik vond het niet onmiddellijk dus daarom kwam ik hier nog even langs daar ik met dit probleem al geholpen was.

Dat "kijk voor de grap..." gedoe vond ik ietwat misplaatst. Het hielp me ook niet. Ik ben gelijk maar blijven googlen en proberen.
Dat is niet misplaatst, het is "spot on".
Blijkbaar is gewoon jouw Google stuk, want als ik doe wat er wordt gezegd is het bij mij wel het eerste zoekresultaat.

[ Voor 5% gewijzigd door DJMaze op 18-03-2018 16:58 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Amarog
  • Registratie: Januari 2013
  • Laatst online: 15-08 17:08
DJMaze schreef op zondag 18 maart 2018 @ 16:57:
[...]

Dat is niet misplaatst, het is "spot on".
Blijkbaar is gewoon jouw Google stuk, want als ik doe wat er wordt gezegd is het bij mij wel het eerste zoekresultaat.
Mijn google is helemaal niet stuk 8)7
Het is inderdaad gemakkelijk zoeken als je weet wat je zoekt en wat je nodig hebt. Dit is en was zo niet in mijn geval.
De eerste post die jij aangeeft op google zou me niet verder hebben geholpen daar ik niet weet wat precies te gebruiken laat staan hoe. |:(
Ik zoek eerder iets in de trend van "How to get the average value by month in mysql" om maar iets te zeggen.
Ik heb mijn probleem dan ook opgelost door andere voorbeelden naast elkaar te leggen en uit te zoeken wat alles precies doet. Trial and Error. Weet ik nu 100% zeker wat mijn code nu doet, neen, daar heb ik helaas niet de nodige kennis voor. Het ding doet wat ik vraag dat het doet, dat is voor mij het belangrijkste.

Nogmaals het is gemakkelijk voor iemand die weet wat je zoekt te zeggen: "Maar kijk toch, zo moeilijk is dat toch niet te vinden??" Ik blijf "kijk voor de grap" misplaatst vinden. Ik snap zijn redenering, het is beter iemand in de juiste richting te duwen en hem zelf z'n probleem te laten oplossen, dat helpt mij of iemand anders inderdaad meer. Maar in dit geval hielp het zetje niet en was de "grap" niet grappig.

Nu, einde discussie, het probleem is opgelost.
Nogmaals bedankt voor de hulp.
Pagina: 1