Autor Zpráva
Kralicek
Profil *
Zdravím

Mám SQL dotaz (v MySQL 5.) na jeho závěru je ORDED BY a GROUP BY. Potřeboval bych nastavit ORDER BY aby řadil podle dvou kritérií. První je položka datum a pokud budou u záznamu stejná data, pak podle plnosti jednoho řetězce.

Tedy jako první se budou řadit všechny záznamy s nejmladším datem a zároveň prázdným řetězcem a pak záznamy s nejmladším datem a s plným řetězcem. Pak budou následovat všechny záznamy s datem-1 a zároveň prázdným řetězcem a pak záznamy s datem-1 a s plným řetězcem. atd...

Jde to udělat v jednom dotazu nebo to budu muset rozdělit do dvou?
Joker
Profil
Kralicek
Jde to velice jednoduše:

ORDER BY sloupec1, sloupec2
Kralicek
Profil *
Tak to právě v tomto případě nelze. Seřadí to nejdříve vše podle jednoho kritéria a pak podle druhého.

Záznamy v databázi mám po dnech, potřebuji tedy řadit nejprve: vše co má dnešní datum a nemá vyplněný řetězec, pak vše co má dnešní datum a má vyplněný řetězec, pak vše co má včerejší datum a nevyplněný řetězec, pak vše co má včerejší datum a vyplněný řetězec,...
Alphard
Profil
mělo by to fungovat, jestli je den stejný, mělo by to řadit podle druhého kritéria, nemáte tam třeba datový typ datetime, že by se řadilo s ohledem na sekundy na druhé kritérium by se nedostalo?
Kralicek
Profil *
Datový typ je "date", druhý sloupec má datový typ varchar

Konkrétně mám:

ORDER BY date, url DESC

kde date - je datum uložení položky
url je zmiňovaný řetězec.
joe
Profil
Podle mě to tak, jak popisuješ neseřadíš nikdy pomocí ORDER BY. Protože to funguje tak, jak napsal Alphard, pokud tedy chceš mít napřed více datumů pod sebou a nechceš mít nic ve sloupci url.

Myslim, že docílit toho bys mohl pomocí union selectu.

---

Moje rada je asi úplně zcestná, asi jsem pochopil špatně otázku, ale nechám to tady.
Kajman_
Profil *
Pokud chcete větší datum nahoře, tak si dejte desc. A z url ho dejte pryč, když mají být prázné url nahoře.

order by `date` desc, url
Joker
Profil
Kralicek
Tak to právě v tomto případě nelze. Seřadí to nejdříve vše podle jednoho kritéria a pak podle druhého.
Seřadí to správně. "...ORDER BY sloupec1, sloupec2" řadí podle sloupec1 a pokud mají záznamy ty hodnoty stejné, řadí podle sloupec2. Což je to, co bylo požadované v prvním příspěvku.
Kralicek
Profil *
Děkuji, zabralo: "order by `date` desc, url"

zkoušel jsem ale nějaké další pokusy v podobě přidání dalších parametru řazení. Ale ty byly ignorovány. Je možné že řazení podle url jako druhý parametr řadí podle "délky url" (tedy počtu znaků)? Aspoň tom odpovídají ty výsledky.

Spíše bych potřeboval aby to bylo zpracováváno binárně - tedy posuzováno pouze url "je/neni".
nightfish
Profil
Je možné že řazení podle url jako druhý parametr řadí podle "délky url" (tedy počtu znaků)?
ne, řadí podle nastaveného řazení (collation)

Spíše bych potřeboval aby to bylo zpracováváno binárně - tedy posuzováno pouze url "je/neni".
nestačilo by podle délky?
order by `date` desc, length(url)
Kajman_
Profil *
Nebo jen to ano ne
order by `date` desc, ifnull(url,'')='' desc, uplnejinydalsisloupecek
Leo
Profil
ifnull(url,'')=''

nestacilo by

url <=> NULL

? Leo
Kajman_
Profil *
Leo
Zkus si
select ''<=>null, ''<=>ifnull(null,'')
V mysql je prázdný řetězec něco jiného než null.
Leo
Profil
V mysql je prázdný řetězec něco jiného než null

No to je mi jasny, akorat nechapu

ifnull(url,'')=''

to nabyva jakych hodnot kdyz je tam porovnani? True a false, tedy 1 a 0 ne? Leo
Kajman_
Profil *
Nabývá to hodnot 0 a 1. Tak jak Králíček chtěl, jen test, zda je url nastavená nebo ne. Nenastavená by měla být asi i null i prázdný řetězec, proto tak.
Miroslav Otta
Profil *
řazení podle dvou kritérií fugnuje například takto: ORDER BY datum DESC, id DESC"; pokud dáte ORDER BY datum, id DESC"; hádejte proč si myslíte, že to nefunguje :-)
Moderátor Alphard: Proč by to nefungovalo? Pro datum se použije defaultní volba, id ji má explicitně určenou.
Keeehi
Profil
Miroslav Otta:
Po třech letech? Opravdu?
Moderátor Alphard: Ale aspoň k věci :-)

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