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
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");
edit: doplněno ORDER BY
Keeehi
Profil
Tori:
edit: doplněno ORDER BY
Ale to tam přece není potřeba.
Tori
Profil
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
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.

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: