Autor | Zpráva | ||
---|---|---|---|
Freak Profil * |
#1 · Zasláno: 27. 2. 2019, 20:25:48
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 |
#2 · Zasláno: 27. 2. 2019, 20:53:55
Použil bych
(posledni tri) union all (custom) |
||
Freak Profil * |
#3 · Zasláno: 28. 2. 2019, 09:44:33
Kajman:
Pravda, jsem blbec, naprorosto jednoduchý. Moc díky! |
||
Freak Profil * |
#4 · Zasláno: 28. 2. 2019, 14:41:10
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 |
#5 · Zasláno: 28. 2. 2019, 14:45:35
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 * |
#6 · Zasláno: 28. 2. 2019, 15:29:50
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 * |
#8 · Zasláno: 28. 2. 2019, 16:07:07
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 |
#9 · Zasláno: 28. 2. 2019, 16:10:30
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 * |
#10 · Zasláno: 28. 2. 2019, 16:16:31
Kajman:
Super, to funguje, vůbec mě to nenapadlo. Díky! |
||
Časová prodleva: 6 let
|
0