ugrás a tartalomhoz

Tárlatok listája random képekkel

Dualon · 2005. Júl. 7. (Cs), 11.40
Sziasztok!

Tárlatok listáját kellene lekérnem úgy, hogy minden tárlatot egy belőle származó, random képpel jelenítsek meg, vagyis a tárlatok listájában minden tárlat neve mellett szerepeljen egy véletlenszerűen kiválasztott kép, amely az adott tárlatba tartozik.
A dolgot bonyolítja, hogy MySQL 3.22 alatt is mennie kéne, tehát al-selectek, union szóba sem jöhet.

Két táblában tárolom az adatokat:
tarlatok
-tarlat (ez azonosítja a tárlatot, egyedi)
-cim
-kepszam
stb.
kepek
-kep_id
-tarlat (a szülőtárlattal ez kapcsolja össze)
-kepnev
-eleres
stb.

Egy lekérés esetén a JOIN-ra gondoltam, de az ON feltételadásnál meg nem lehet randomizálni.
Két lekérés esetén az jutott eszembe, hogy a második select-tel a képek közül kérek le véletlenszerű sorrendben annyit, ahány tárlat van, és úgy, hogy a tárlatok azonosítói végig 'vagy' logikai összeállításban szerepelnek, de ezzel meg az a gond, hogy lehet olyan tárlat a két lekérés után, amelyhez nem lesz kép, meg olyan is, amelyhez akár több is...
Úgy meg tudom oldani a dolgot, hogy lekérem a tárlatokat, aztán mindegyikhez sorban egy-egy SELECT-tel egy random képet, de ez nem épp erőforráskímélő.

Tudnátok tanácsot adni?
 
1

pedig

tiku I tikaszvince · 2005. Júl. 7. (Cs), 21.44
Elég sokat agyaltam a dolgon, és arra jutottam, hogy szerintem, csak úgy tudod megoldani, hogy először lekéred a tarlat_id-ket, utánna egyenként egy random képet.

SELECT * FROM tarlatok
WHERE tarlat = '1'
ORDER BY RAND() LIMIT 0,1
Eszembe jutott, hogy a JOIN-os megoldást kiegészíthetnéd egy a GROUP BY -al is, de ekkor mindig, csak az adott albumhoz tartozó első képet fogja vissza adni.
Felötlött még a HAVING de a MySQL manual szerint 5.0.2 előtt nem elérhető :( (Bár ezt lehet hogy félreértettem)

TikuVoltam
Ma is holnap fekszünk le, mint tegnap
2

szép feladat

Anonymous · 2005. Júl. 8. (P), 14.26
Ez egy szép feladat, s én is erőlködtem egy kicsit a megoldásával, de egyelőre nem látom a megoldását. Valójában, még a subquery-st sem.
Ha ugyanis a az összes tárlatból le kell kérni egy képet, s mindegyikből csak egyet, akkor elkerülhetetlennek látom a GROUP BY parancs alkalmazását.
Ez pedig lehetetlenné teszi a véletlen rendezést.
Tárlatonként az utolsó képeket könnyen ki lehetne kapni...

SELECT * FROM kepek
WHERE kep_id IN
(SELECT MAX(kep_id) FROM kepek GROUP BY tarlat_id)


de h. tárlatonként egy véletlen képet?
ha valakinek van vmi megoldása subquery alkalmazásával, örömmel venném...

xyz
3

ciklus vagy ideiglenes tábla

tiku I tikaszvince · 2005. Júl. 8. (P), 17.35
Akárhogy töröm a fejem, és bújom a manualt nem találom a megoldást.
Próbáltam először élőszóval megfogalmazni a problémát, aminek az lett az eredménye, hogy vagy egy ciklus kellene a lekérdezésbe (ami tudtommal nincs), amivel végigmegyek a teljes eredmény táblán, és ha még nincs azzal a tárlat azonosítóval rekordom, akkor beteszem az eredménybe, ha van akkor eldobom.
Utánna próbáltam, hogy a belső selectbe, véletlen sorba lekérek mindent, utánna a külsőben group by

SELECT album_id FROM
  (SELECT tarlat.tarlat_id, elnevezes, kepszam, kep_id, kepnev, eleresi_ut
   FROM tarlat LEFT JOIN kepek ON tarlat.tarlat_id=kepek.tarlat_id
   ORDER BY  RAND())
GROUP BY tarlat_id
Ezzel csak az a baj, hogy MySQL ezt mondja rá:
Every derived table must have its own alias ami annyit jelent, (már ha jól törni ángélus), hogy minden származtatott táblának önmaga aliasának kell lennie? de ezt valahogy itt nem tudom értelmezni.

Azt kellene, hogy egy ideiglenes táblába kipakolni, random sorrendben, a kapcsolt táblákat, és abból egy GROUP BY -al kikérni. Csak attól félek, hogy ilyen fícsör nincs a MySQL-ben :(

TikuVoltam
Ma is holnap fekszünk le, mint tegnap
4

beágyazott lekérdezéssel MEGVAN

tiku I tikaszvince · 2005. Júl. 8. (P), 17.46
ahogy elküldtem az előző postot, megint ránéztem, és észrevettem egy hiányzó vesszőt, meg egy picit még alakítottam rajta és ez lett:

SELECT tarlat.tarlat_id, elnevezes, kepszam, kep_id, kepnev, eleresi_ut
FROM tarlat LEFT JOIN (
  SELECT kep_id, tarlat_id, kepnev, eleresi_ut
  FROM kepek ORDER BY RAND())
AS kep USING (album_id)
GROUP BY tarlat_id
És működik :)
már csak az eredeti kérdésre kellene felelni: Azt még mindig tartom, hogy sztem, egy lekérdezéssel ezt nem lehet megoldani. DE
Az már megoldható, hogy az előző hozzászólásomban levő lekérdezés belső SELECTjét futtatod le, és a kapott tömbön, végig mész egy ciklussal, a fentebb vázolt "algoritmussal": tehát, veszed az első rekordot, ha az album azonosító még nem szerepel az eredmény tömben, akkor beleteszed, egyébként eldobod.

TikuVoltam
Ma is holnap fekszünk le, mint tegnap