Autor | Zpráva | ||
---|---|---|---|
nemeja Profil |
Pěkné ráno,
dělám si knihovnu na galerii, nicméně narazil jsem na problém, kdy bych chtěl vybrat náhodný obrázek z DB, který spadá do daného alba. Narazil jsem ovšem na problém, jak nejefektivněji vybrat foto z DB. Na tomto blogu jsem vyzkoušel, otestoval a zmeřil všechny řešení. S rozdílem několika řádů mi vyšlo, jako vítězné řešení, řešení číslo 2(pomocí PHP). Jenže narazil jsem na problém, jak tam zakomponovat podmínku, která by mi umožnila vybírat fotky pouze pro jedno album. Struktura tabulek: Alba -id | popis | nazev | url | obrazek(obrázek, který se bude vypisovat, při náhledu galerie, pokud je nula, vybere se náhodný) Fotky - nazev | popis | url | album_id | koncovka Moc děkuji za jakoukoliv radu :) |
||
Tori Profil |
#2 · Zasláno: 31. 8. 2012, 10:07:02
SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` WHERE album_id = $id |
||
Kajman Profil |
Nebo si u fotek uchovávejte pořadí fotky v rámci alba. Místo id pak použijte toto číslo.
Pro následné dotazy bude vhodný index na kombinaci sloupců (album_id, poradi_v_albu). Pro řešení od Tori, bude výhodný index (album_id,id). Problémem u toho řešení může být situace, kdy přidám 100 fotek do hledaného alba, pak spoustu moc fotek do jiných alb, pak ještě jednu fotku do hledaného alb (dostane o hodně vyšší id) - tím ten náhodný výběr vybere skoro vždy tu fotku poslední. Pokud se fotky přidávají v jednom balíku, může to fungovat dobře. |
||
Tori Profil |
Řešení č.3 z toho blogu taky nevypadá špatně, obešel by se tak zmíněný problém s nespojitou řadou ID [#3]:
$result = mysql_query("SELECT COUNT(*) FROM fotky WHERE album_id = $id"); $count = mysql_result($result, 0); $offset = mt_rand(0, $count); $result = mysql_query("SELECT * FROM fotky WHERE album_id = $id ORDER BY id LIMIT $offset, 1"); |
||
Keeehi Profil |
#5 · Zasláno: 31. 8. 2012, 10:23:26
Tori:
„edit: doplněno ORDER BY“ Ale to tam přece není potřeba. |
||
Tori Profil |
#6 · Zasláno: 31. 8. 2012, 10:28:05
Keeehi:
Rozdíl je v tom, že pak to může vybrat jiný řádek, než jaký se spočítal na ř.3. Ale vlastně když to má být náhodné, tak to nevadí, máte pravdu. Díky, psala jsem rychleji než myslela. |
||
Kajman Profil |
#7 · Zasláno: 31. 8. 2012, 10:31:02
Tori:
Pokud nebývají v galerii tísíce fotek, tak to může být také celkem svižné. Keeehi: Díky tomu order by id by tu byl ještě prostor pro drobné zrychlení - to by mohlo přinést hledaní podle id zezadu při velkém offsetu. Něco jako $offset = mt_rand(0, $count); $ascdsc = ''; if($offset>$count/2) { $ascdsc = 'desc'; $offset = $count-$offset-1; } $result = mysql_query("SELECT * FROM fotky WHERE album_id = $id ORDER BY id $ascdsc LIMIT $offset, 1"); |
||
nemeja Profil |
Moc vám všem děkuji, jakmile dorazím na chatu, tak se na to kouknu a vyzkouším. Počítám, že bude v galerii cca. 300-500 fotek, takže bude možná stačit i [#2] Tori. Pak sem hodím, jak to dopadlo :)
Kajman: Přemýšlel jsem taky, že bych udělal to pořadí v rámci alba, ještě se rozmyslím. |
||
Časová prodleva: 12 let
|
0