Autor | Zpráva | ||
---|---|---|---|
martin6541 Profil |
#1 · Zasláno: 11. 1. 2022, 15:16:13
Pěkný večer.
Mám výpis kategorie, kde se zboží řadí od nejnižší ceny. case 'product_price': $orderBy = ' ORDER BY `product_price` '.$filterOrderDir.', p.`virtuemart_product_id` '.$filterOrderDir; V jedné kategorii musím mít zobrazeno pár extrémně kvalitnícha předražených modelů. Cena je na vyžádání, protože se neustále mění. Když ale cenu nezadám, zobrazí se jako nejlevnější na začátku. Já ale potřebuji takové produkty zařadit na samotný konec. Jeden dobrák mi na jiné diskuzi poradil toto: case 'product_price': $orderBy = ' ORDER BY `product_price` IS NULL ASC, `product_price` '.$filterOrderDir.', p.`virtuemart_product_id` '.$filterOrderDir; Uměli by jste někdo poznat, co tam může být za chybu? Děkuji. |
||
Firibix Profil |
#2 · Zasláno: 11. 1. 2022, 15:31:34
Reakce na martina6541:
Aktualizaci jakého systému? Jak přestalo fungovat? Stránka hlásí chybu, nebo se jenom špatně řadí? Je opravdu v databázi ve sloupci product_price u produktů s cenou na vyžádání NULL , nebo číselná nula/prázdný řetězec?
|
||
martin6541 Profil |
#3 · Zasláno: 11. 1. 2022, 17:10:33
Firibix:
„Je opravdu v databázi ve sloupci product_price u produktů s cenou na vyžádání NULL “
To je asi ta klíčová otázka. Je tam 0. Takže: IS NULL ASC, IS 0 ASC, |
||
Kajman Profil |
#4 · Zasláno: 11. 1. 2022, 17:28:07
= 0 ASC, Nebo ošetřit obě varianty ORDER BY coalesce(`product_price`, 0) = 0 ASC, |
||
martin6541 Profil |
#5 · Zasláno: 11. 1. 2022, 17:49:01
Kajman:
„ ORDER BY coalesce(`product_price`, 0) = 0 ASC, “
funguje. jen nevím, jak je to myšleno "obě varianty"? |
||
Firibix Profil |
#6 · Zasláno: 11. 1. 2022, 18:01:03
Reakce na martina6541:
Klauzuli ORDER BY `product_price` IS NULL ASC, `product_price`, `product_id` si lze představit následovně:
1. Databáze vytvoří „virtuální sloupec“, do kterého vloží hodnoty funkce `product_price` IS NULL , přičemž ta vrací 1 pokud je ve sloupci product_price hodnota NULL , 0 jinak.
2. Řádky se seřadí odzadu podle sloupce product_id , pak podle sloupce product_price .
3. Nakonec se řadí podle virtuálního sloupce, a to vzestupně. Tím pádem se řádky s product_price nastaveným na NULL zařadí na konec (ve virtuálním sloupci budou mít hodnotu 1 , ostatní řádky 0 ). Řazení je stabilní; to znamená, že produkty, kde je cena vyplněná, zůstanou ve správném pořadí.
Pokud místo funkce IS NULL použijeme funkci COALESCE(`product_price`, 0) = 0 , tak se hodnoty ve virtuálním sloupci budou generovat následovně:
1. Nejprve se vyhodnotí COALESCE(`product_price`, 0) , která hodnoty NULL nahradí za 0 a ostatní nechá být.
2. Následně se aplikuje porovnání = 0 , které vrátí 1 tam, kde výstup předchozího kroku byl 0 (tj. kde původní hodnota product_price byla buď 0 nebo NULL ), 0 jinak.
3. Zbytek procesu řazení probíhá stejně. To znamená, že varianta s COALESCE bude řadit na konec seznamu ty produkty, kde product_price je NULL nebo 0 .
|
||
Časová prodleva: 2 roky
|
0