ugrás a tartalomhoz

Kapcsolótáblával lekérdezés probléma

lm · 2008. Jún. 22. (V), 23.15
Sziasztok!
Egy gyors segítségre lenne szükségem.

Adott 3 tábla
1.) film_nezo(id, nev)
2.) filmek(id, cim)
3.) kapcsolotabla(id, nezo_id, filmek_id)

Mivel sok-sok kapcsolat van kapcsolótábla segítségével tárolom ki milyen filmet nézett meg.

Kérdés: hogyan lehet kilistáztatni azokat a nézőket aki látta a 'shrek 1'-et, 'shrek 2'-t ÉS a 'csipkerózsika'-t ?

Fontos az ÉS mivel nekem az és kapcsolatra lenne szükségem, mert ha vagy kellene az egyszerű:

SELECT name FROM film_nezo n, filmek f, kapcsolotabla k WHERE n.id=k.nezo_id AND f.id=k.filmek_id AND f.cim IN ('shrek 1','shrek 2','csipkerózsika')

Előre is köszi
 
1

Aliasok

janoszen · 2008. Jún. 22. (V), 23.34
Ez nem valami gyakorló vagy iskolai feladat? :)

Egyébként a titok nyitja az, hogy háromszor joinolsz a néző felől, három különböző aliast megadva a táblának, majd a három alias alapján felállítasz kritériumokat. Tehát nem az eredeti táblanevet írod, hanem az aliasát.
SELECT * FROM elsodlegestabla
 LEFT JOIN masodlagostabla AS masodlagos1
  ON masodlagos1.elsodleges_id=elsodlegestabla.id
 LEFT JOIN masodlagostabla AS masodlagos2 
  ON masodlagos2.elsodleges_id=elsodlegestabla.id
 WHERE masodlagos1.valamimezo='a'
  AND masodlagos2.valamimezo='b';
Nem merek megesküdni rá, hogy ez 100%-ig helyes szintaktikailag, de ezen a vonalon el tudsz indulni.
2

köszi

lm · 2008. Jún. 22. (V), 23.43
Nem nem iskolai feladat :) az eredeti teljesen más (termékek, stb) csak inkább az iskolai példát írtam le hogy éthetőbb legyen.

Egyébként majd php-ból fogom generálni, tehát kicsit sok LEFT JOIN és aliast lessz az eredeti lekérdezés, de nekem is mintha valami ilyesmi rémlene.

Köszi.
3

Join limit

janoszen · 2008. Jún. 23. (H), 06.42
Arra figyelj, hogy ha MySQL-t használsz, akkor 61 a maximális join szám, amit egy querybe tehetsz. Tudom, hogy brutálisan soknak hangzik, de ha az ember egy általános keresőengine-t ír és normalizálja az adatbázist, baromi gyorsan eljut oda. :)
8

max 2,3 esetére

Hodicska Gergely · 2008. Jún. 24. (K), 20.12
Ez a fajta módszer nem az igazi. Adott esetben 2,3 egyezőségre még jó lehet, de általában is Vbence által mutatott megoldás a jobb és gyorsabb.


Üdv,
Felhő
9

Jogos...

janoszen · 2008. Jún. 25. (Sze), 05.31
Jogos, hirtelen ez volt a legegyszerűbb megoldás ami eszembe jutott. :)
4

Alternatíva

vbence · 2008. Jún. 23. (H), 10.23

SELECT n.id, n.nev, COUNT(*) AS szam
FROM film_nezo AS n
LEFT JOIN kapcsolotabla AS k ON k.nezo_id=n.id
LEFT JOIN filmek AS f ON f.id=k.filmek_id
WHERE f.cim='shrek 1' OR f.cim='shrek2' OR f.cim='csipkerozsika'
GROUP BY n.id
HAVING szam=3;
Én első ránézésre gyorsabbnak mondanám a 3 (illetve több) joinos változatnál, de a valódi sebesség függ a rekordok számától, indexeidtől (ugye használsz indexeket?) és pár hasonló dologtól. Ha kíváncsi vagy melyik esetben mit csinál a mysql, magyaráztasd meg vele, az egyes lekérdezések végrehajtását:

EXPLAIN SELECT . . . 
5

jogos

lm · 2008. Jún. 23. (H), 16.22
Na igen mostmár értem a MySQL miért szabályozta le a JOIN-ok számát, az előző változatban 10 JOIN felett gyakorlatilag haldokolt a szerver.

Ennél szépen fut.

Köszi az alternatívát bejött, bár kétségtelen hogy az előző változat is működött.
6

indexek?

gex · 2008. Jún. 23. (H), 17.51
azért 10 join nem a világ vége, inkább nálad lehet a hiba. indexeket használsz?
7

Korlátozás...

janoszen · 2008. Jún. 23. (H), 18.54
A 61-es join korlátozás nem azért van, mert MySQL a szerver terhelésben gondolkodott, ugyanis akár mindegy is lehetne bizonyos alkalmazásoknál, hogy mennyi idő alatt fut le, hanem azért (ha jól tudom) mert egy 64 bites bitfieldben tárolja a joinokat. Legalábbis valami ilyesmit írtak a hozzáértők.