Autor Zpráva
Hitman
Profil
Dobrý den,

chtěl bych se zeptat na takovou drobnost, nikde se mi ji nepodařilo najít:

Potřebuji klasický dotaz z řazením:

SELECT xxx FROM....ORDER BY nazev ASC

A potřebuji přidat upřednostnění pro položky které mají třeba příznak priorita 1. Čili něco jako:

SELECT xxx FROM....LEFT JOIN priznaky ORDER BY (WHERE priznaky.priorita = 1 - mimo jiné, tohle ID může mít v tabulce příznaků zároveň priorita = 5 atd., mě zajímá jestli má 1 nebo ne), nazev ASC

(jedná se o tabulku příznaků přes JOIN, takže jedno ID může mít priorita = 1, priorita = 8 atd., ale já chci upřednostnit ty s 1).
juriad
Profil
SELECT xxx FROM....ORDER BY (priorita = 1) DESC, nazev ASC

Aneb v ORDER BY může být jakýkoli výraz včetně porovnání. Rovnost vrací jedničku, nerovnost vrací nulu, a ty nejspíš chceš zobrazit rovnost před nerovností.
Hitman
Profil
A je možné ostatní parametry vyřadit z vyhledávání?

Takto mi to totiž seřadí jak píšeš pokud je podmínka splněna 1, ale tu 0 už bych nechtěl zohleňovat.

Chci mít první záznamy které mají priorita = 1 a poté řadit dle názvu. Takto mi to ale seřadí dle toho zda tam 1 je nebo není a potom podle názvu. Protože některé záznamy v tabulce priority nemají a tak ono to vybere nejdříve ty které je mají (a mají tak podmínku 0 nebo 1) a poté až bere ostatní.

Nevím jestli to jde pochopit raději ještě na příkladu:

Tabulka seznam:
id_zaznamu nazev
1 pepa
2 jarda
3 jirka
4 zdeněk

Tabulka priority:
id_zaznamu priorita
2 (jarda) 1
3 (jirka) 6
3 (jirka) 1
4 (zdeněk) 4

Takže by to mělo vypsat nejdříve ty kteří mají prioritu 1:
jarda, jirka

A poté dle názvu ostatní:
pepa, zdeněk

Ale vypíše to ty s prioritou 1:
jarda, jirka

Ty s podmínkou o prioritě 0 (kteří jsou v tabulce, ale nemají 1):
zdeněk


A potom ostatní:
pepa

Správné pořadí: jarda, jirka, pepa, zdeněk

Pořadí při souč. řešení: jarda, jirka, zdeněk, pepa
juriad
Profil
Hitman:
Ukaž celý dotaz, ono to zavání nějakým LEFT JOINem a GROUP BY
TomášK
Profil
Co ORDER BY (IFNULL(priorita, 0) = 1) DESC? Nezkoušel jsem.
Hitman
Profil
TomášK:
Supr, vypadá to že to funguje.

juriad:
Je to hrozně dlouhej nepřehlednej dotaz z různýma proměnnýma a objekty (předělávka něčí práce)..

Každopádně díky moc kluci :-)
juriad
Profil
SELECT s.nazev
FROM seznam s
LEFT JOIN priorita p ON s.id_zaznamu = p.id_zaznamu AND p.priorita = 1
ORDER BY p.priorita = 1 DESC, s.nazev ASC

Mně tento dotaz funguje.
sqlfiddle.com/#!9/6eb57a/1
Hitman
Profil
Tak řešení juriada funguje dobře, u TomášeK je problém s tím že pokud je v tabulce předchozí záznam s jinou prioritou, vyhodnotí se ten a dále už se nehledá.

U juriada mi chybělo "AND p.priorita = 1"...

// Řešení Keeehiho funguje také dobře (i bez toho AND...), díky :-)
Keeehi
Profil
Hitman:
To že to záleží na pořadí bude důsledek těch joinů. Kdyby jsi ukázal ten dotaz celý, jak psal juriad, tak bychom věděli určitě. Takhle mohu tipovat, že chceš použít funkci min. Asi
ORDER BY (IFNULL(MIN(PR.`priorita`), 0) = 1) DESC, (JM.`nazev`)

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: