Portál AbcLinuxu, 7. listopadu 2025 01:13
Zdravím, mám tabulku záznamů (cca 5-6k) pro které uživatelé hlasují. Skóre je uloženo u každého záznamu a hlasy jsou v další tabulce, kde je i ID záznamu a ID klienta. Nad hlavní tabulkou probíhá random select. Vše je ok, dokud nepotřebuji klientovi poskytnout záznam který ještě nehodnotil. Zatím jsem to vyřešil tak, že se po random vyselectuje ještě hlas a pokud vrátí nenulový výsledek, random se provádí znovu. Pokud ale klient má většinu záznamů ohodnocenou, může se na konec vykonávat počet hlasů + 1 dotazů a to se mi moc nelíbí.
Další možnost, která mě napadla je vybrat si všechny hlasy uživatele a pak přidat do random dotazu WHERE id NOT IN(...) ale takový dotaz by nakonec byl extrémně dlouhý.
Struktura:
zaznamy: ID hash data skore pocet_hlasu pocet_precteni
int vch txt int int int
PRK
\
\ Vazba pres id zaznamu
-------
\
\
hlasy: ID klient DID skore cas
int vch int int timestamp
PRK
WHERE id NOT IN ( SELECT did FROM hlasy WHERE klient = id_prihlaseneho_uzivatele )
select * from ankety left join hlasy on ankety.id = hlasy.id_ankety and klient = id_prihlaseneho_uzivatele where hlasy.id_ankety is nullOno 5000 by zas pro databázi nemělo být až tak moc.
SELECT * FROM zaznamy ORDER BY id OFFSET RANDOM(SELECT count(*) FROM zaznamy)
WHERE Id NOT IN (SELECT did FROM hlasy WHERE klient = XY)
LIMIT 1
Pozor na něco ve stylu
.... ORDER BY RANDOM()
to vede na ugly full table scan.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.