Portál AbcLinuxu, 10. května 2025 14:12
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.