Czy da się coś takiego zrobić w czystym mysql czy lepiej uzyć do tego PHP

0

Mam takie pytanie mam sobie tabele (moods) gdzie są pola

id(int) level_mood(float) date_start(datetime) date_end(datetime)
1 1 2019-05-20 12:00:00 2019-05-20 12:40:00
2 1.4 2019-05-20 12:40:00 2019-05-20 13:40:00
3 -1.2 2019-05-20 14:00:00 2019-05-20 17:40:00
4 10 2019-05-22 12:00:00 2019-05-22 12:40:00
5 -4 2019-05-22 12:40:00 2019-05-22 12:50:00

I teraz chodzi o to, żeby w polu wyszukiwania było pole od jakiej daty ma zacząć wyszukiwanie do jakiej i jest też opcja od której godziny do której i w monecie jak nie będzie wpisane od której godziny do której to wszystko jasne, ale jak będzie opcja że ma wyszukać od godziny 12:20 - 15:00 dla dnia 2019-05-18 -

(ale to jest ważne, że ma obliczyć wartośc level_mood tylko dla danego czasu, że pobrać dla godziny 12:20 - 15:00 TYLKO fragment w tym przypadku nastroju o di 1 nie 40 minut tylko 20 minut czyli to będzie nie 1 * 40 tylko 1 * 20
Czyli dla dat i czasu wejściowych od godziny 12:20 - 15:00 dla dnia 2019-05-18 - końca mają być takie operacje data 2019-05-20 = (20 * 1 + 60 * 1.4 + 60 * -1.2) / 140 , 2019-05-22 (40 * 10 + 10* -4) / 50
)

t w czystym php wiem jak to zrobić tylko w czystym php muszę za każdym razem wyciągać te rekordy w danym dniu i odejmować czyli w pętli jest dużo zapytań i to trwa trochę wolno.
Ale nie wiem jak to zrobić w mysql.

0

....wyciągać te rekordy w danym dniu i odejmować czyli w pętli jest dużo zapytań i to trwa trochę wolno.
Nie wiem co to oznacza wolno? 50ms? 500ms? a może 5 minut? W pętli jest dużo zapytań? Dlaczego? nic to nam nie mówi skoro nie wrzuciłes zadnego kodu ani zapytan.

0

@axelbest: Przykładowo dla roku trwa to 8 sekund (gdzie jest chyba 15 nastroji dla pojedyńczego dnia)

Ale nie wiem czy jest sens dawać kod bo mi chodzi tylko o to, żeby sprawdzić to się da zrobić tylko z za pomocą jednego zapytania?

2

Ja tam i tak nic nie rozumiem opisu wymagań. Wrzuć dokładny przykład. Jeśli opisujesz obliczenia dla 05-18 to wrzuć dokładnie dane opisujące ten przykład alternatywnie przykład opisz na już wklejonych danych. Po ocenie co jest do zrobienia można coś więcej mówić.

0

Ja to widze tak, pobierz wszystkie rekordy dla zadanego przedziału czasowego. Potem obrabiasz to w phpie. Napisz jakie inne zapytania wykonujesz w bazie?

0

@axelbest: Ta funkcja wygląda tak (ale ja to pisałem jakieś 1.5 roku temu teraz to chce trochę inaczej napisać)

private function calculateAverage($dataStart,$dataEnd,$dayInput = "") {
    $Moods = Moods::query();
    $hour = Auth::User()->start_day;
    $average = 0;
    $second = 0;
    $sumMood = 0;
    $sumAnxiety = 0;
    $sumNer = 0;
    $sumStimu = 0;
    $harmonyMood = [];
    $harmonyStimu = [];
    $harmonyNer = [];
    $harmonyAnxiety = [];

    $Moods->select(DB::Raw("(DATE(IF(HOUR(date_start) >= '$hour', date_start,Date_add(date_start, INTERVAL - 1 DAY) )) ) as dat  "))
           ->selectRaw("Date_add(date_start, INTERVAL - '$hour' HOUR) as date_start")
            ->selectRaw("Date_add(date_end, INTERVAL - '$hour' HOUR) as date_end")
            ->selectRaw("time(Date_add(date_end,INTERVAL - '$hour' HOUR)) as d")
            ->selectRaw("level_anxiety as level_anxiety")
            ->selectRaw("level_nervousness as level_nervousness")
            ->selectRaw("level_stimulation as level_stimulation")
            ->selectRaw("level_mood as level_mood")

                  ->where("id_users",$this->IdUsers);
    if ($dataStart != "") {
        $Moods->where("date_start",">=",$dataStart);
        $Moods->where("date_start","<",$dataEnd);
    }


        $Moods->whereRaw("time(Date_add(date_start,INTERVAL - '$hour' HOUR)) < '" .$this->hourEnd . "'");
        $Moods->whereRaw("time(Date_add(date_end,INTERVAL - '$hour' HOUR)) >= '" .$this->hourStart . "'");   

    
    $list = $Moods->get();
    

    $i = 0;
    
    foreach ($list as $moodss) {
        
            $time1 = strtotime($moodss->date_start);
            $time2 = strtotime($moodss->date_end);


             $divi1 = explode(" ",$moodss->date_start);
             $divi2 = explode(" ",$moodss->date_end);

                $dataa = explode(" ",$dataEnd);

                    $dateComparate1 = strtotime($divi1[0] . " " . $this->hourStart );

                $dateComparate2 = strtotime($divi2[0] . " " . $this->hourEnd);

            if ($time1 <= $dateComparate1) {
                $div = $dateComparate1;

            }
            else {
                $div = $time1;
            }
            if ($time2 >= $dateComparate2) {
                $div2 = $dateComparate2;
            }
            else {
                $div2 = $time2;
            }
        

                $sumAnxiety += ($div2 - $div) * $moodss->level_anxiety;
                $harmonyAnxiety[$i] = $moodss->level_anxiety;
                

                $sumNer += ($div2 - $div) * $moodss->level_nervousness;
                $harmonyNer[$i] =  $moodss->level_nervousness;

                $sumStimu += ($div2 - $div) *  $moodss->level_stimulation;
                $harmonyStimu[$i] = $moodss->level_stimulation;

                $sumMood += ($div2 - $div) * $moodss->level_mood;
                $harmonyMood[$i] =  $moodss->level_mood;
            
        $second += $div2 - $div;
        $this->list["mood"][$i] = $moodss->level_mood;
        $this->list["anxiety"][$i] = $moodss->level_anxiety;
        $this->list["nervousness"][$i] = $moodss->level_nervousness;
        $this->list["stimulation"][$i] = $moodss->level_stimulation;
    
        $i++;
    }
    $this->countList = $i;
    if ($i == 0) {
        //return;
    }
             //if ($type == "anxiety") {
                 
    array_push($this->tableAnxiety,round(($this->sortMood($harmonyAnxiety) ),2));
     //}
     //else if ($type=="ner") {
    array_push($this->tableNer,round(($this->sortMood($harmonyNer) ),2));
     //}
     //else if ($type=="stimulation") {
    array_push($this->tableStimu,round(($this->sortMood($harmonyStimu) ),2));
     //}
     //else {
    array_push($this->tableMood,round(($this->sortMood($harmonyMood) ),2));
    //}


     
      if ($second == 0) {
          return [];
      }
     
      $return = [];
    //if ($type == "mood") {
    array_push($return,round($sumMood  / $second,2));
        //return ;
    //}
    //else if ($type=="anxiety") {
    array_push($return,round($sumAnxiety  / $second,2));
        //return round($sumAnxiety  / $second,2);
    //}
    //else if ($type=="ner") {
        array_push($return,round($sumNer  / $second,2));
        //return round($sumNer  / $second,2);
    //}
    //else  {
        array_push($return,round($sumStimu  / $second,2));
        //return round($sumStimu  / $second,2);
    //}
        return $return;

}

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