Autor | Zpráva | ||
---|---|---|---|
anonmyníí Profil * |
#1 · Zasláno: 14. 3. 2015, 10:24:00
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 Jak by měla prosím ORDER BY část vypadat? Děkuji. |
||
mimochodec Profil |
#2 · Zasláno: 14. 3. 2015, 10:31:42
ORDER BY (start_date >= now()) ASC, create_date DESC... |
||
anonymníí Profil * |
#3 · Zasláno: 14. 3. 2015, 10:34:45 · Upravil/a: anonymníí
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 |
#4 · Zasláno: 14. 3. 2015, 10:42:15 · Upravil/a: mimochodec
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 * |
#5 · Zasláno: 14. 3. 2015, 10:47:21 · Upravil/a: anonymníí
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 * |
#6 · Zasláno: 14. 3. 2015, 10:51:20
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 |
#7 · Zasláno: 14. 3. 2015, 10:54:50
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 |
||
anonymníí Profil * |
#8 · Zasláno: 14. 3. 2015, 10:58:14
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 |
#9 · Zasláno: 14. 3. 2015, 11:04:13
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 * |
#10 · Zasláno: 14. 3. 2015, 11:31:18
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í. |
||
Časová prodleva: 9 let
|
0