Tárlatok listája random képekkel
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?
■ 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?
pedig
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
szép feladat
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...
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
ciklus vagy ideiglenes tábla
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
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
beágyazott lekérdezéssel MEGVAN
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