| Autor | Zpráva | ||
|---|---|---|---|
| matlala Profil |
#1 · Zasláno: 5. 2. 2009, 11:48:19
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"));
|
||
| Alphard Profil |
#2 · Zasláno: 5. 2. 2009, 11:54:38 · Upravil/a: Alphard
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 |
#3 · Zasláno: 5. 2. 2009, 11:59:56
No to je jedno, je to pomalý a stejně to háže chybu a problém to nevyřeší!
|
||
| Alphard Profil |
#4 · Zasláno: 5. 2. 2009, 12:10:47
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 |
#5 · Zasláno: 5. 2. 2009, 12:14:07
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 * |
#6 · Zasláno: 5. 2. 2009, 12:32:07
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 |
#7 · Zasláno: 5. 2. 2009, 13:04:01 · Upravil/a: matlala
„select * from fotogalerie_foto where id='$id_fotogalerie' order by rand() limit 1“
Ano tohle už funguje, děkuju |
||
| TomášK Profil |
#8 · Zasláno: 5. 2. 2009, 13:22:15 · Upravil/a: TomášK
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 |
#9 · Zasláno: 5. 2. 2009, 13:38:14 · Upravil/a: matlala
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 |
#10 · Zasláno: 5. 2. 2009, 14:01:59
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 * |
#11 · Zasláno: 5. 2. 2009, 14:06:51
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 |
#12 · Zasláno: 6. 2. 2009, 09:55:21
ne to taky nefunguje, ale už to neřešte, funguje to první a to stačí
|
||
|
Časová prodleva: 17 let
|
|||
0