Portál AbcLinuxu, 11. května 2025 10:24
SELECT * FROM `subjekty` ORDER BY `nazov` LIMIT [start], 10
lenze moj problem je v tom ze tie zaznamy MAJU BYT utriedene nahodne:
SELECT * FROM `subjekty` ORDER BY RAND() LIMIT [start], 10
vyzera to dobre ale ked prejdem v strankovani na druhu (a dalsie) stranky tak sa poradie zaznamov premiesa (kvoli RAND();) a strankovanie nebude fungovat ako strankovanie ale ako chaos.
napadlo ma vytvorit nejaku nahodne utriedenu tabulku a tahat to z nej, ale zda sa mi to ako hlupy napad lebo to poradie by bolo aj tak vzdy rovnake (aj ked pomiesane).
riesili ste niekto podobny problem? dakujem za rady.
shuffle()
select *, RAND(seed) as rnd from ... order by rnd limit ...;Pruda samozřejmě je, že MySQL musí při každém takovém dotazu počítat náhodná čísla pro celou tabulku.
CREATE TEMPORARY TABLE xxx SELECT ..... ORDER BY RAND();a pak teprve strankovat:
SELECT ... FROM xxx LIMIT 0, 10; SELECT ... FROM xxx LIMIT 10, 10;... Nakonec pomocnou tabuku dropnout (zruší se sice sama, ale až při uzavření konexe).
SELECT tmp.id, data.otazka, data.neco FROM tmp, data ORDER BY tmp.rnd WHERE data.id=tmp.id LIMIT x,10dočasná tabulka tmp by mohla být generována při přihlášení, to nechám na vás Milan
Uznávám, že to není žádná extra rada, ale nešlo by prostě celé zadání prohlásit za nesmyslné a neimplementovat to? Jakékoliv řešení z výše uvedených má totiž poměrně logicky docela brutální overhead, což je pochopitelné, protože násilně zavádí (deterministicky) náhodné chování tam, kde z podstaty věci nic takového není. To je prostě typická situace, kdy je nutné nikoliv "řešit požadavek", ale zamyslet se nad tím, zda ten požadavek "dává smysl"...
Pokud by to mělo fungovat na tabulce s pár záznamy, tak je to samozřejmě fuk. Ale, jak praví tazatel, "nie je to az take zle ake ked uvazujeme tabulku s velkym mnozstvom zaznamov tak to nie je vhodne riesenie. musi existovat aj nieco elegantnejsie", zde vidím kámen úrazu. Protože pro velkou tabulku to obávám se elegantně udělat nejde...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.