Zadejte hledaný výraz...

Výběr náhodných prvků z MySQL

naniccz
verified
rating uzivatele
(3 hodnocení)
23. 4. 2010 15:17:50
Potřebuji vybrat náhodně deset prvků z resultu, u kterého předem neznám velikost (pohybuje se od jednotek, až k desítkám tisíců). Je v MySQL nějaká obdoba Oraclovského ROWNUM? Jde mi o to, aby DB nenačítala (a neřadila podle RAND() ) celý výsledek, jen kvůli prvním 10 prvkům... A na nic nemůžu přijít.
23. 4. 2010 15:17:50
https://webtrh.cz/diskuse/vyber-nahodnych-prvku-z-mysql/#reply495686
ne
verified
rating uzivatele
(22 hodnocení)
23. 4. 2010 15:35:01
SELECT * FROM nazov_tabulky ORDER BY RAND() LIMIT 10
23. 4. 2010 15:35:01
https://webtrh.cz/diskuse/vyber-nahodnych-prvku-z-mysql/#reply495685
naniccz
verified
rating uzivatele
(3 hodnocení)
23. 4. 2010 15:40:10
Napsal ne;501377
SELECT * FROM nazov_tabulky ORDER BY RAND() LIMIT 10
To je právě to, co nechci, protože to je ukrutně pomalé. Zatím nejlepší řešení co jsem našel je zjistit velikost výsledku pomocí COUNT(*), dále mám v tabulce přidaný sloupec RANDOM (s indexem), který jednou za čas náhodně vypočítám, a data vybírám "SELECT * FROM tbl ORDER BY random LIMIT ".rand(0,$pocet-1).", 10", což je ošklivé, a nejedná se o náhodný výběr, ale náhodný pohled na jednoznačně seřazená data.
23. 4. 2010 15:40:10
https://webtrh.cz/diskuse/vyber-nahodnych-prvku-z-mysql/#reply495684
ne
verified
rating uzivatele
(22 hodnocení)
23. 4. 2010 15:56:27
bohuzial, inak to nepojde... jedine tak ze by si chcel 1 riadok, to neni problem (ako pises s COUNT)... ale na 10 riadkov = 10 query, cize vykon "ide do kytek"
tvoj sposob je celkom dobry, vsak ani RAND() nie je realna nahoda...
23. 4. 2010 15:56:27
https://webtrh.cz/diskuse/vyber-nahodnych-prvku-z-mysql/#reply495683
staci mit unikatni numerickou hodnotu pro kazdy radek, nejlepe tedy 1..n, kde vlaste n je pocet radek, kazdopaden max() na dany sloupec, pak nahodne vygenerujes podle COUNT nahodna cisla mezi 1 a n a trivilani select .. from .. in ()
pokud budou v sekvenci 1..n diry, vygenerujes si tech nahodnych cisel vice a select muzes omezit LIMITem, nebo to budes tocit v podminenem cyklu, nez se ti jich COUNT nasbira
rozhodne jakakoli kamobinace zde zminena je mnohokrat rychlejsi nez rand()/limit
23. 4. 2010 16:50:08
https://webtrh.cz/diskuse/vyber-nahodnych-prvku-z-mysql/#reply495682
naniccz
verified
rating uzivatele
(3 hodnocení)
23. 4. 2010 16:54:16
Takově řešení mám, že mám předgenerovanou posloupnost (taky mohu použí primární klíč), ale problém je, že ty výsledky o velikosti x tisíc, až pár jednotek jsou ta samá data, takže snažit se náhodně trefit do nějakého ID je v krejních případech nekonečná smyčka... Proto jsem to řešil tím náhodným LIMITem... Docela zákeřnost
---------- Příspěvek doplněn 23.04.2010 v 17:09 ----------
Myslim, že nejrychlejší bude
$cnt = select count(*) ...;
if($cnt
jinak
{
$pouzito = {}; $vysledky = {};
while(nemám dost výsledků)
{
$row = select ... where id not in $pouzito limit rand(1,$cnt), 1;
$pouzito += $row;
$vysledky[] = $row;
}
}
---------- Příspěvek doplněn 23.04.2010 v 17:20 ----------
Resp. omezit tu smyčku na pouhé stavění selectu a pak je z UNIONovat do jednoho, aby se zbytečně nevolalo mnohokrát do databáze. Hmm. Tak jestli je tohle optimální řešení, tak to teda
23. 4. 2010 16:54:16
https://webtrh.cz/diskuse/vyber-nahodnych-prvku-z-mysql/#reply495681
Pro odpověď se přihlašte.
Přihlásit