21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
anonmyníí
Profil *
Ahoj,

mám v databázi záznamy s kolonkami (mj.) status, start_date a create_date.

Status nabývá hodnot 1 (aktivní) a 2 (uzavřený).
Start_date je datum, kdy úkol začíná a tedy do kdy je "aktivní" - tedy určený k přiřazení někomu
Create_date je jesné, datum vložení.

Já bych potřeboval řadit nejprve nadcházející úkoly, a to podle data vložení (tedy status = 1 a současně start_date >= now()). Až za nimi opět podle data vložení ostatní záznamy (mající status 1 i 2) podle data vložení. Nejnovější jsou vždy nahoře.

Nyní mám:

ORDER BY a.create_date DESC - řadí bez ohledu na status a start_date od nejnovějších.


ORDER BY a.create_date DESC,
CASE WHEN a.status = 1 AND a.start_date >= NOW() THEN 1 ELSE 0 END DESC,
a.create_date DESC
- řadí nejprve ty, které mají status=1 a start_date >= now, ale podle start_date, ne podle create_date

Jak by měla prosím ORDER BY část vypadat?

Děkuji.
mimochodec
Profil
ORDER BY (start_date >= now()) ASC, create_date DESC...
anonymníí
Profil *
mimochodec:
Ještě bych potřeboval nějak pracovat s tím statusem, tedy to, co píšeš ty (vyzkouším), ale nejprve pro status = 1.

Teprve pod tím bude status = 2 (a status = 0) a start_date < now().


To, co píšeš ty, mi posune některé inzeráty (konkrétně 1 ze 4 aktivních) na první místo, další 3 ale až úplně nakonec. To není ono :-)
mimochodec
Profil
anonymníí:
Prostě to ber tak, že těch kritétií můžeš přidat kolik potřebuješ a každé z nich může být sloupec nebo nějaký výraz. Priorita těch řazení se zleva doprava snižuje. To co jsem napsal já, pro účely řazení zafunguje jako by to byla jednička nebo nula (splnění / nesplnění té podmínky).


anonmyníí:
(mající status 1 i 2)

Tady nepíšeš, jestli ta hodnota 1, 2 má mít na řazení vliv, nebo se má projevit jen to, jestli to je větší než nula a pak to vliv mít nemá.
anonymníí
Profil *
mimochodec:
Vím, jak ORDER BY funguje pro více podmínek (tzn. že podle další řadí ty prvky, které odpovídají první, resp. mají stejnou hodnotu jako první).

Nicméně tady to s tím statusem z nějakého zajímavého důvodu nefunguje, a to je to, nač se ptám. Ne na obecnou a základní teorii. Tvůj kód nefunguje, funguje o řád hůře, než to co dosud mám. I tak děkuji za snahu, nicméně problém jsi mi vyřešit nepomohl a netřeba mi zde ukazovat, jaká že je základní syntaxe ORDER BY.

Napadne někoho něco jiného?

Předem děkuji.


Jak nepíšu? Píšu.

Nejprve "status = 1 a současně start_date >= NOW()", pak zbytek záznamů bez ohledu na status podle data vložení (tedy create_date). Na statusu v té druhé polovině už nezáleží.

Upozorňuji, že status nabývá 3 hodnot, (0, 1, 2).
juriad_
Profil *
anonymníí:
Uvedom si, ze vysledek porovnani neni v SQL true/false ale 1 nebo 0. Napis si tedy aritmeticky nebo logicky vyraz, ktery vrat 1 pro zaznamy, ktere maji vyt nahore. A pak to serad DESC - jedicka bude pred nulou.
mimochodec
Profil
anonymníí:
Nejprve "status = 1 a současně start_date >= NOW()", pak zbytek záznamů bez ohledu na status podle data vložení (tedy create_date). Na statusu v té druhé polovině už nezáleží.

Takhle mi to skoro zní jako

ORDER BY (status = 1 AND start_date >= NOW()), create_date
Ale nechám se poddat.
anonymníí
Profil *
mimochodec:
Takhle to taky nefunguje, resp. funguje poobně jako ten můj dotaz. Nahoře jsou sice ty, které mají status = 1, ale řazeny dle start_date. Což nechci, řazeno má být podle create_date.

juriad:
Vím, že návratová hodnota je 1 nebo 0. Ale jak píši mimochodcovi, řadí to záhadně podle start_date, které je uvnitř podmínky, ne podle create_date.
mimochodec
Profil
anonymníí:
Nahoře jsou sice ty, které mají status = 1, ale řazeny dle start_date. Což nechci, řazeno má být podle create_date.

To bych neřekl. Musí to řadit tak, že nejdřív bude skupina, splňující tu závorku, pak bude to, co ji nesplňuje. Obě ty skupiny budou (každá sama o sobě) řazeny podle create_date.
anonymníí
Profil *
mimochodec:
Podobný, ne-li stejný zápis jsem zkoušel už dříve. A výsledek, co to vrací, si necucám z prstu, píšu, co jsem teď před pár minutami reálně viděl. Taky se mi to zdá divné, ale třídí to záznamy na aktivní a neaktivní dobře, nicméně ty aktivní to řadí špatně (podle start_date).
Alphard
Profil
anonymníí [#10]:
Moc často používáte slovo „záhadný“ :-)
Ten dotaz se mi zdá ok sqlfiddle.com/#!9/8e498/1, kdyžtak upravte data tak, jak vám nefungují.

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