Autor Zpráva
matlala
Profil
Ahoj, pořeboval bych vypsat náhodně fotku z databáze (jsou v ní jen URL k fotkám), ale problém je v tom, že v ID_fotky (id každé fotky pro výběr, úpravu, mazání) jsou mezery takže třeba řada je 1,2,3,5,6,8,9. Tím pádem nemůžu jednoduše použít žádný rand ani podobně.

Nemáte někdo nějaké jednoduché řešení. Já zkoušel
$kolik_fotek=mysql_num_rows(mysql_query("SELECT * FROM fotogalerie_foto WHERE id='$id_fotogalerie'"));
$nahoda=mt_rand(0 ,$kolik_fotek);
$zazn = mysql_fetch_array(mysql_query("SELECT * FROM fotogalerie_foto WHERE id='$id_fotogalerie' LIMIT ".$kolik_fotek.", 1"));
což samozdřejmě po vymazání nekterých fotek nefunguje
Alphard
Profil
select * from fotogalerie_foto where id in (select id from fotogalerie_foto order by rand() limit 1)


jde to i bez poddotazu, ale je to výrazně pomalejší
matlala
Profil
No to je jedno, je to pomalý a stejně to háže chybu a problém to nevyřeší!
Alphard
Profil
já jsem id použil jako unikátní identifikátor, vy to asi máte jinak, ale já do vaší tabulky nevidím
a jestli jsem udělal syntaktickou chybu, tak by neškodilo se trochu více rozepsat o té chybě
matlala
Profil
no já mám 2 tabulky
fotogalerie-id fotogalerie název a další údaje-nepodstatné
fotogalerie-foto-id(spojení s 1 tabulkou),id_foto (id každé fotky) a další
Kajman_
Profil *
matlala
což samozdřejmě po vymazání nekterých fotek nefunguje

Tak to nechápu, proč by to nemělo fugnovat, když tam je limit a id se nepoužívá. To mažete fotky jako soubory a necháte je v databázi? Jen si myslím, že by tam mělo být
$nahoda=mt_rand(0 ,$kolik_fotek-1);

Rychlejší bude count(*) než mysql_num_rows.

Jinak by to mohlo být např. takto

select * from fotogalerie_foto where id='$id_fotogalerie' order by rand() limit 1
matlala
Profil
select * from fotogalerie_foto where id='$id_fotogalerie' order by rand() limit 1
Ano tohle už funguje, děkuju
TomášK
Profil
Nebude order by rand() zbytečně pomalé? Tabulka se musí seřadit, pokaždé znova, index na to nejde.
$rand = mysql_fetch_row(mysql_query("SELECT FLOOR( RAND() * SELECT COUNT(*) FROM fotogalerie_foto WHERE conditions)")))[0];
$result = mysql_query("SELECT * FROM fotogalerie_foto WHERE conditioins LIMIT $rand, 1");

Jedná se v podstatě o totéž, co napsal matlala, jen s použítím COUNT(*), což napsal Kajman :) A dají se na to napsat indexy. Matlala píše, že to po vymazání některých fotek nefunguje, ale mě se zdá, že by to mělo fungovat i na děravá id. Uvažuju špatně?
matlala
Profil
tak ne nefunguje po změně na
$rand = mysql_fetch_row(mysql_query("SELECT FLOOR( RAND() * SELECT COUNT(*) FROM fotogalerie_foto WHERE conditions)"));
$zazn = mysql_query("SELECT * FROM fotogalerie_foto WHERE conditioins LIMIT $rand, 1");


mi vyhazuje chybu Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /data/www/vput.cz/www.vput.cz/fotgal.php on line 25
TomášK
Profil
Míněno to bylo tak, že za conditions si dosadíš podmínky, které potřebuješ, měl jsem to vypíchnout. V tvém případě id='$id_fotogalerie'. Na konci mám závorku navíc, to jsi odhalil dobře :) Přemýšlím, jestli tam má být [0], php nepoužívám, lovím to z hloubi své paměti - výsledek by měl být ten, abych v $rand měl výsledek toho dotazu.

$result = mysql_query("SELECT FLOOR( RAND() * SELECT COUNT(*) FROM fotogalerie_foto WHERE id='$id_fotogalerie' )") or die( mysql_error());
$row = mysql_fetch_row($result);
$rand = $row[0];
$zazn = mysql_query("SELECT * FROM fotogalerie_foto WHERE id='$id_fotogalerie' LIMIT $rand, 1") or die(mysql_error());


Druhý pokus, snad dopadne lépe :)
Kajman_
Profil *
Myslím, že pokud je dostatečné omezení díky výběru jen z jedné kategorie, tak může být méně náročná verze s jedním dotazem. Pokud by se bralo z celé tabulky, může být kombinace count(*) + limit rychlejší. V tomhle případě rozdíly asi nebudou moc veliké.
matlala
Profil
ne to taky nefunguje, ale už to neřešte, funguje to první a to stačí

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: