Autor Zpráva
Jakub0916
Profil *
Dobrý den, peru se se získáním dat a sejmutí nejvyšší hodnoty ze sloupce
$q = $db->query("SELECT *, MAX(price) AS maxPrice FROM back_product WHERE in_stock > 0 AND category IN ($categoryTreeUpIDs) AND active='1' /*LIMIT $offset, $per_page*/");
Query mi vypíše pouze jeden řádek, a to dokonce ani ne s nejvyšší hodnotou.
Je možné získat data a nejvyšší hodnotu ze sloupce při jedné query? - nějakou sub-query?

Děkuji.
Kajman
Profil
Nejjednodušší to je, pokud umí databáze window funkce.

SELECT p.*,
       Max(price) OVER() AS maxPrice
FROM   back_product p
WHERE  in_stock > 0
       AND category IN ( $categorytreeupids )
       AND active = '1'  

Pokud ne, dělal bych to dvěma dotazy - i když to jde udělat poddotazem podobným tomuto
SELECT p.*,
       (SELECT Max(price)
        FROM   back_product
        WHERE  in_stock > 0
               AND category IN ( $categorytreeupids )
               AND active = '1') AS maxPrice
FROM   back_product p
WHERE  in_stock > 0
       AND category IN ( $categorytreeupids )
       AND active = '1'  
který však může být zdlouhavější než dva dotazy.

A pokud není důležité pořadí, tak si to můžete seřadit podle price desc a pro maximum vzít první řádek.
Jakub0916
Profil *
Kajman:
První dotaz nezvládne a druhý trvá opravdu dlouho, je lepší to vytáhnout dvěmi dotazy.
Potřeboval jsem toto porovnání, mockrát děkuji, krásný zbytek dne :)
Kajman
Profil
Toto řešení by mělo znemožnit plánovači, aby počítal maximum pro každý řádek zvlášť. Ale pro přehlednost bych to nechal v těch dvou dotazech.
SELECT p.*,
       m.maxPrice
FROM   back_product p
       CROSS JOIN (SELECT Max(price) maxPrice
                   FROM   back_product
                   WHERE  in_stock > 0
                          AND category IN ( $categorytreeupids )
                          AND active = '1') m
WHERE  in_stock > 0
       AND category IN ( $categorytreeupids )
       AND active = '1'  

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