Autor Zpráva
Bita
Profil *
Zdravím našel jsem zde jak se jednotlivé dotazy zapisují, ale potřeboval bych pomoct s konkrétním dotazem...chci třídit záznamy od největší ceny po nejmenší cenu neví někdo prosím jak to zapsat ? :-( Problémové místo jsem zvýraznil tučne. Předem díky moc...

$query="SELECT idZbozi, nazev, kratky_popis, cena, url FROM eshop_zbozi WHERE (cena BETWEEN $hodnota1 AND $hodnota2) AND idZbozi IN(SELECT item FROM eshop_zbozi_kategorie WHERE structure='$idStranky') ORDER BY $order ASC LIMIT $start,$per_page";
juriad
Profil
Problém je na jiném místě, na konci. Tam je klauzule ORDER BY, která v překladu říká, podle čeho řadit.
Momentálně je to řízené proměnnou $order, ale směr řazení je vždy ASC(ending) - vzestupně. Opakem je řazení sestupně DESC(ending).

Pokud vždy chceš řadit podle ceny sestupně změň klauzuli ORDER BY na:
ORDER BY cena DESC
lionel messi
Profil
$query="SELECT idZbozi, nazev, kratky_popis, cena, url FROM eshop_zbozi WHERE (cena BETWEEN $hodnota1 AND $hodnota2) AND idZbozi IN(SELECT item FROM eshop_zbozi_kategorie WHERE structure='$idStranky') ORDER BY cena DESC, $order ASC LIMIT $start,$per_page";

juriad odpovedal rýchlejšie aj s podrobným vysvetlením.
Bita
Profil *
Díky moc za rady...už mi to řadí jen částečně od největších cen...jelikož mám ceny i nad 99 999 KČ tak od těch seto neřadí ... řadí se to jen podle devítek....pokud je třeba 130 000 cena tak se nezobrazí jestli mi rozumíte
rovi
Profil
[#1]Order by znamená setřídit podle.
Tudíž
...
ORDER BY $order DESC
...
kde v tu chvíli musí být v $order = 'cena';

co jsem pochopil z sql dotazu, cos napsal.
Slovíčko DESC / ASC vyměň podle potřeby. Nastavuje výpis řazení desc je sestupně
juriad
Profil
Bita:
Nerozumíme. Jaký je datový typ sloupce cena?
Jaké pořádí (cen) to teď vrací, napiš raději ukázku pořádí a ne popis, který nikdo nechápe.
anonymníí
Profil *
Bita:
Je cena typu int? Ukládáš tam čísla bez mezer? Jaké jsou proměnné $hodnota1 a $hodnota2?

Pokud je cen v rozmezí těch proměnných, je uložena jako číslo a bez mezer, tak to fungovat musí.
Bita
Profil *
Vaše rady jsou určitě správné, teď jsem zjistil že cenu mám typu varchar, to je určitě tím ne ?
rovi
Profil
juriad
Tak tak.
bita
Vypadá to, že v sloupi cena nejsou čísla, ale nějaký typ řetězce textu.

Pro formátování používej php a ne databázi.
Bita
Profil *
$hodnota1=0;
$hodnota2=999898989;

cena typu varchar

SQL dotaz :
$query="SELECT idZbozi, nazev, kratky_popis, cena, url FROM eshop_zbozi WHERE (cena BETWEEN $hodnota1 AND $hodnota2) AND idZbozi IN(SELECT item FROM eshop_zbozi_kategorie WHERE structure='$idStranky') ORDER BY cena DESC"
juriad
Profil
Bita:
Že ta cena je uložená přesně takto včetně mezer a jednotky na konci.
99 999 KČ
Jestli ano, můžeš si hodit mašli.
Toto není dlouhodobě udržitelná varianta. Databáze slouží k ukládání dat v nejobecnější podobě, formátování do ní nepatří.
Cena je a vždy byla (desetinné) číslo.
rovi
Profil
Cena by měla být alespoň INT
nebo tedy
juriad
float
juriad
Profil
rovi:
Nikoli. Cena by měl být DECIMAL.

Pokud je cena jen "99999" jako řetězec, tak bude fungovat toto (samozřejmě to nezvládne desetinnou čárku ani mezery):
ORDER BY CONVERT(cena, DECIMAL(10,2)) DESC
rovi
Profil
juriad
Díky! Jdu upravovat databáze :D
juriad
Profil
rovi:
Ještě odkazy:
http://stackoverflow.com/questions/13030368/best-data-type-to-store-money-values-in-mysql

These types are used when it is important to preserve exact precision, for example with monetary data.
http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html
Bita
Profil *
ne to rozhodně ne :-) jen prostě varchar jinak ve formátu 555.. žadne kč ani mezery...díky všem moc za rady
anonymníí
Profil *
Bita:
musí být int.

integery (čísla) se porovnávají klasicky, jak tě učili ve škole.

Stringy se porovnávají podle prvního (a dalšího, při shodě) znaku, 2 > 1, ale také 2 > 100.

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: