Mam taki problem nigdy nie uzywałem pętli bezpośrednio w mysql, ale chyba teraz będa potrzebne.
Mam sobie cos takiego jest sobie funkcja w laravelu.
public static function selectOldUsee(int $idProduct,string $dateEnd,int $idUsers,int $startDay,$hour) {
return self::join("products","products.id","usees.id_products")
->selectRaw("sum(usees.portion) as portions")
->selectRaw("products.type_of_portion as type")
->selectRaw("
count(usees.portion)
//tutaj w tym miejscyu
as how")
->selectRaw(DB::Raw("(DATE(IF(HOUR( usees.date) >= '" . $startDay . "', usees.date,Date_add(usees.date, INTERVAL - 1 DAY) )) ) as dat "))
->where("usees.date","<=",$dateEnd)
->where("usees.id_products",$idProduct)
->where("usees.id_users",$idUsers)
->whereRaw("(time(date_add(usees.date,INTERVAL - $startDay hour))) <= '$hour[1]'")
->whereRaw("(time(date_add(usees.date,INTERVAL - $startDay hour))) >= '$hour[0]'")
->groupBy(DB::Raw("(DATE(IF(HOUR( usees.date) >= '" . $startDay . "', usees.date,Date_add(usees.date, INTERVAL - 1 DAY) )) ) "))
->orderBy("usees.date","DESC")
->get();
}
I teraz zaniemiem tego jest wyświetlanie liczby rekordów w danym dniu, i sie dobrze wyświetla, ale są rekordy, które miały datę przykładowo 2024.10.23 12:12:00 i 2024.10.23 12:13:00
Czyli różnica w czasie ich dodania różni się maxymalnie 3 minuty to wtedy dany rekord będzie zapisywany jako 1 wystapienie a nie dwa czyli jak będą takie rekordy w danym dniu
2024.10.23 12:12:00 i 2024.10.23 12:13:00 i 2024.10.23 15:12:00 i 2024.10.23 20:12:00
To wtedy zapytanie ma zwrócić count = 3
I w pętli mysql da się to zrobić, ale nigdy wcześniej nie korzystałem z pętli w mysql
No uruchamiam w mysql adminie taka kkonstrukcję
CREATE PROCEDURE testif()
BEGIN
SET @number_title = 0;
SET @max1 = 1;
label1: LOOP
IF (@number_title<@max1) THEN
ITERATE label1;
END IF;
SET @number_title := @number_title + 1;
END LOOP;
END $$
To wyskakuje błąd
Nie udało się wykonać SQL : Wykonanie SQL CREATE PROCEDURE testif() BEGIN SET @number_title = 0; SET @max1 = 1; label1: LOOP IF (@number_title<@max1) THEN ITERATE label1; END IF; SET @number_title := @number_title + 1; END LOOP; END $$ nie powiodło się : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '$$' at line 1
Natomiast juz cos takiego jest dobrze,
BEGIN
# LOOP - Obiegi początek
SET @obieg=1;
obieg_loop: LOOP
SELECT 'obieg: '+@obieg;
IF @obieg=1 THEN
SET @zxc=5;
ELSEIF @obieg=2 THEN
SET @zxc=4;
ELSEIF @obieg=3 THEN
SET @zxc=7;
ELSE
SELECT 'błąd';
END IF;
SELECT @zxc;
END
Ale jak ten sam kod wkleje w zapytanie w kodzie php(laravel) to wysakuje ten sam błąd