Invalid use of group function błąd mysql

0
select timeDIFF (( godzina_zaczecia ), godzina_zakonczenia ) as suma,year(godzina_zaczecia) as rok,month(godzina_zaczecia) as miesiac, day(godzina_zaczecia) as dzien,sum(TIMESTAMPDIFF (second, godzina_zaczecia , godzina_zakonczenia ) / count(godzina_zaczecia))  from nastroj group by (dzien),(miesiac),(rok) order by godzina_zaczecia;

Witam mam taki kłopot to zapytanie zwraca błąd, chcę osiągnąć taki skutek, że zsumuje mi czas wszystkich nastrojów, a potem je podzieli przez liczbę nastrojów danego dnia i to zapytanie wydawały by się dobre tylko zwraca taki błąd.
Invalid use of group function

0
GROUP BY YEAR(godzina_zaczecia),MONTH(godzina_zaczecia) , DAY(godzina_zaczecia) 
0

Nadal to samo.

0

Nie wiem, co robi timeDiff, ale pewnie funkcja agregujaca nie jest, wiec tez musisz dorzucic do GROUP BY

0

Widzę. Żle ostatni nawias...

SUM(TIMESTAMPDIFF (SECOND, godzina_zaczecia , godzina_zakonczenia )) / COUNT(godzina_zaczecia)
0

Teraz działa dzięki.

0

A teraz mi chodzi o to czy w sql da się jednym zapytaniem takie obliczenie matematyczne wykonać ?

Daje kod w php

    private function oblicz_ile_czasu_trwaly_nastroje_danego_dnia($rok,$miesiac,$dzien,$typ) {
        $id_users = Auth::User()->id;
        $nastroje = array();
        $wynik = 0;
        $wynik2 = 0;
        $wynik5 = 0;
        $poszczegolne_dane = DB::select("select godzina_zaczecia,godzina_zakonczenia,$typ from nastroj 
        where year(godzina_zaczecia) = '$rok'  and 
        month(godzina_zaczecia) = '$miesiac' and 
        day(godzina_zaczecia) = '$dzien'  and 
        id_users = '$id_users'");
        foreach ($poszczegolne_dane as $poszczegolne_dane2) {
            $wynik2 = strtotime($poszczegolne_dane2->godzina_zaczecia);
            $wynik3 = strtotime($poszczegolne_dane2->godzina_zakonczenia);
            $wynik4 = $wynik3 - $wynik2;
            $wynik5 = $wynik5 + ($wynik4 * $poszczegolne_dane2->$typ);
            $wynik += $wynik4;
            
        }
        return array($wynik,$wynik5);
    }
$a  = oblicz_ile_czasu_trwaly_nastroje_danego_dnia(2018,12,23,"poiozm_nastroju) 
$wynik = $a[1] / $a[0];

Czyli chodzi generalnie o to, że bierze poszczególne nastroje danego dnia wylicza ich czas trwania i potem mnoży czas trwaia przez poziom_nastroju a na końcu dzieli wynik przez średnią nastroju bo chciałbym żeby to wyszukiwało według nastroju danego dnia i nie wiem czy to zrobić za pomocą jednego zapytania czy skryptu ?

0

Już to zrobiłem w taki sposób.

SELECT timeDIFF (( godzina_zaczecia ), godzina_zakonczenia ) AS suma,YEAR(godzina_zaczecia) AS rok,MONTH(godzina_zaczecia) AS miesiac, DAY(godzina_zaczecia) AS dzien,sum(TIMESTAMPDIFF (SECOND, godzina_zaczecia , godzina_zakonczenia)  * poziom_nastroju) / sum(TIMESTAMPDIFF(second,godzina_zaczecia,godzina_zakonczenia)) FROM nastroj GROUP BY (dzien),(miesiac),(rok) ORDER BY godzina_zaczecia;

0

Tylko teraz mam pewnien problem

Do tego zapytania dałem where

SELECT timeDIFF (( godzina_zaczecia ), godzina_zakonczenia ) AS suma,YEAR(godzina_zaczecia) AS rok,MONTH(godzina_zaczecia) AS miesiac, DAY(godzina_zaczecia) AS dzien,round(sum(TIMESTAMPDIFF (SECOND, godzina_zaczecia , godzina_zakonczenia)  * poziom_nastroju) / sum(TIMESTAMPDIFF(second,godzina_zaczecia,godzina_zakonczenia)),2) as 'a'  FROM nastroj   where 'a' < 2.2 GROUP BY (dzien),(miesiac),(rok) ORDER BY godzina_zaczecia;

I jak przykładowo dam w warunku where a < 2.2
To mi nawet wyrzuca większe od 2.2

Już sobie poradziłem trzeba było zastosować having zamiast where.

1 użytkowników online, w tym zalogowanych: 0, gości: 1