Portál AbcLinuxu, 26. dubna 2024 06:29


Dotaz: RANDOM select a hlasy v jiné tabulce

26.3.2013 07:03 RYU.cz | skóre: 16 | Vsetín
RANDOM select a hlasy v jiné tabulce
Přečteno: 747×
Odpovědět | Admin

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

Linux is like a teepee - no windows, no gates, apache inside. | RYU.cz
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Tarmaq avatar 26.3.2013 12:00 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
Odpovědět | | Sbalit | Link | Blokovat | Admin
jak jako dlouhy?
WHERE id NOT IN (
  SELECT did
  FROM hlasy
  WHERE klient = id_prihlaseneho_uzivatele
)
Don't panic!
26.3.2013 13:20 RYU.cz | skóre: 16 | Vsetín
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
SELECT did FROM hlasy WHERE klient = id_prihlaseneho_uzivatele muze vratit az 5 tisic zaznamu
Linux is like a teepee - no windows, no gates, apache inside. | RYU.cz
26.3.2013 13:37 Kit
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
A to je problém?
26.3.2013 17:33 kaaja | skóre: 24 | blog: Sem tam něco | Podbořany, Praha
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
A co
select * from ankety 
left join hlasy on ankety.id = hlasy.id_ankety and klient = id_prihlaseneho_uzivatele
where hlasy.id_ankety is null
Ono 5000 by zas pro databázi nemělo být až tak moc.
26.3.2013 18:02 kuka
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
To uz je asi citelnejsi s pouzitim not exists (je to de facto to slovni zadani prepsane do "anglictiny") a vsechny uvedene varianty (exists, in, left join) se v rozumne databazi provedou vicemene stejne. 5000 zaznamu neni vubec nic.
26.3.2013 18:01 RYU.cz | skóre: 16 | Vsetín
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
Odpovědět | | Sbalit | Link | Blokovat | Admin
Děkuji za tipy, vyzkouším.
Linux is like a teepee - no windows, no gates, apache inside. | RYU.cz
27.3.2013 00:05 Logik
Rozbalit Rozbalit vše Re: RANDOM select a hlasy v jiné tabulce
Odpovědět | | Sbalit | Link | Blokovat | Admin
A jak vůbec děláš random select? Rozhodně to nedělej stylem: vyberu všechny kam můžu hlasovat a pak z něj náhodně vyberu. Pokud Ti nezáleží na úplně uniformním rozdělení pravděpodobnosti, tak můžeš použít:

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.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.