Autor Zpráva
martin6541
Profil
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;
Tohle řešení pár dní fungovalo. Po aktualizaci systému ale přestalo a už se mi nedaří to opravit.
Uměli by jste někdo poznat, co tam může být za chybu?
Děkuji.
Firibix
Profil
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
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,
změnit na:
IS 0 ASC,
tak jednoduché to asi nebude, že?
Kajman
Profil
= 0 ASC,

Nebo ošetřit obě varianty
ORDER BY coalesce(`product_price`, 0) = 0 ASC,
martin6541
Profil
Kajman:
ORDER BY coalesce(`product_price`, 0) = 0 ASC,
funguje. jen nevím, jak je to myšleno "obě varianty"?
Firibix
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0