Autor Zpráva
Michal Kváček
Profil *
Dobrý den, ahoj.
Při tvorbě vlastní fotogalerie jsem narazil na problém s výpisem alb a náhodných fotografií z nich. Na titulní stránce jsou zobrazeny tyto alba, kde titulní obrázek tvoří náhodně vybraná fotka (ovšem z toho alba, pochopitelně). Do teď jsem vše řešil pomocí jednoduchého dotazu:
SELECT `file_name` FROM `galerie_galleries`WHERE album_id=id_alba ORDER BY RAND() LIMIT 1.

Fungovalo to, nicméně pro n alb se odeslalo také n stejnách dotazů (lišících se pouze v id alba).
Abych poněkud usměrnil tuto "šílenost", vytvořil jsem tento dotaz:
SELECT
g.id, g.gal_name, g.gal_url, g.description, UNIX_TIMESTAMP(g.created), g.score, p.file_name
FROM `galerie_galleries` AS g
JOIN (
	SELECT `file_name` FROM `galerie_photos` ORDER BY RAND() LIMIT 1
) AS p
GROUP BY g.id

Funguje dobře - až na jeden detail. V tomto podání vrací jako file_name stále stejné jméno souboru. Logicky - nemá WHERE. Zde ovšem přichází kámen úrazu - myslel jsem si, že přidáním WHERE gallery=g.id se vše vyřeší. Nevyřešilo. Databáze nezná sloupec g.id

A já se tedy ptám - je možné nějak dostat do poddotazu id galerie, která je vybírána v hlavním dotazu (prvním SELECTu)? Nebo na to jdu úplně špatně a měl bych to celé znovu promyslet?

Budu vděčný za každou radu, či jen postrčení (ale i odkaz na google - angličtina nevadí). Děkuji.
DJ Miky
Profil
Jednodušší bude nepřipojovat tabulku JOINem, ale dát poddotaz přímo jako sloupec:
SELECT
g.id, g.gal_name, g.gal_url, g.description, UNIX_TIMESTAMP(g.created), g.score,
(SELECT file_name FROM `galerie_photos` WHERE gallery=g.id ORDER BY RAND() LIMIT 1) file_name
FROM `galerie_galleries` AS g
Michal Kváček
Profil *
DJ Miky:
Geniální, děkuji mnohokrát. V databázích musím ještě trénovat :).
Medvídek
Profil
Michal Kváček:
Jen doporučim nepoužívat ORDER BY RAND()
Michal Kváček
Profil *
Medvídek:
Já vím, četl jsem o tom. Jenomže nevím, jak to do toho dotazu dostat. Zkoušel jsem postup popsaný na adrese http://www.warpconduit.net/2011/03/23/selecting-a-random-record-using-mysql-benchmark-results/ (2. dotaz) a časově vycházelo stále lépe ORDER BY RAND() (při nějakých 1300 řádcích)
Každopádně si vždycky nechám rád poradit :).

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:

0