Autor Zpráva
Freak
Profil *
Zdravím,

rád bych se zeptal, dá se nějak řešit přímo v dotazu do databáze následující situace:

- chci vypsat 4 příspěvky,
- první 3 budou nejnovější příspěvky dle ID,
- 4. příspěvek bude custom (pevný id: id=18)

Umím vypsat 3 custom příspěvky a pak nejnovější dle ID:
 order by a.id=18 desc, a.id=17 desc, a.id=16 desc, a.id desc

Ale se situací výše si nevím rady.

Díky moc!
Kajman
Profil
Použil bych
(posledni tri)
union all
(custom)
Freak
Profil *
Kajman:
Pravda, jsem blbec, naprorosto jednoduchý. Moc díky!
Freak
Profil *
Kajman:
Jinak UNION ALL úplně nefungoval, zvláštně se to řadilo, každopádně s UNION to funguje.

Ještě přemejšlím, pokud bych tam chtěl přidat, aby se po těchto 4 záznamech zobrazil i ten zbytek? Aktuálně mě napadá to udělat druhym dotazem, kde prvním dotazem vypíšu 4 záznamy, do array si uložím jejich ID a pak na základě tohoto filtru vypíšu ostatní záznamy. Nebo má smysl řešit nějak jednom dotazem?

Díky!
Keeehi
Profil
Freak:
Union ani Union all negarantují žádné řazení. To, proč ti to union seřadí je pravděpodobně kvůli tomu, že union vyhazuje z výsledku duplikáty. A aby to mohl dělat efektivně, tak si ho nejdříve seřadí. Spoléhat se na to ale nemůžeš. Pokud chceš mít jistotu, že je to seřazené správně, tak co celé obale selectem a řazení prováděj až v něm.
Freak
Profil *
Keeehi:
Ale jak mám řešit to řazení, vzhledem k podmínce v prvním příspěvku + následně když chci vypsat i ostatní příspěvky? Díky!
Kajman
Profil
V mysql tuším fungovalo to uzávorkování k možnosti zachování řazení a omezení limitu jen na ten jeden dotaz. Ty závorky jste použil?

(select t.* from table t where t.id not in (18) order by t.id desc limit 0, 3)
union all
(select t.* from table t where t.id in (18))
union all
(select t.* from table t where t.id not in (18) order by t.id desc limit 3, 99999999999)

Případně v nových verzích s podporou window funkcí by mohlo jít něco jako

select x.* from
(select t.*, row_number() over(order by id desc) rn from prispevky t) x
order by rn<=3 desc, id=18 desc, id desc

Případně to dát na třetí místo až v aplikační logice (např. php).
Freak
Profil *
Kajman:
Tak tomu nerozumím, přesně takhle to mám:
(select t.* from table t where t.id not in (18) order by t.id desc limit 0, 3)
union all
(select t.* from table t where t.id in (18))
union all
(select t.* from table t where t.id not in (18) order by t.id desc limit 3, 99999999999)

Pokud to spustím:
1) localhost
(Typ serveru: MySQL
Verze serveru: 5.6.37 - Source distribution)
- výsledek je správně

2) SQL fiddle
- výsledek je správně

3) Server
(Verze serveru: 10.0.38-MariaDB-0+deb8u1 - (Debian))
- vrací výsledek špatně, odlišně od 1 a 2
Kajman
Profil
Tak bych si přidal pomocný sloupec, něco jako
(select t.*, 1 zdroj from table t where t.id not in (18) order by t.id desc limit 0, 3)
union all
(select t.*, 2 zdroj from table t where t.id in (18))
union all
(select t.*, 3 zdroj from table t where t.id not in (18) order by t.id desc limit 3, 99999999999)
order by zdroj, id desc
Freak
Profil *
Kajman:
Super, to funguje, vůbec mě to nenapadlo. Díky!

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