ugrás a tartalomhoz

LEFT JOIN-nal nem kiértékelhető eredményt kapok

Totti 1986 · 2010. Szep. 21. (K), 18.11
Sziasztok!

A bejelentkezést akarom egyszerűbbé tenni azzal, hogy a táblákat LEFT JOIN-nal kapcsolom össze, de végül nem olyan eredményt ad ki, amit használni tudnék.

Van egy tábla, amiben a regisztrált adatok vannak eltárolva.
Egy másik tábla tárolja a kedvenceket, minden sor egy kedvenc, megadva, hogy mi az, és kihez tartozik.
A harmadik tábla a komment, mihez írták, és ki írta.
És mondjuk a negyedik egy adminjog, ahol meg van adva, hogy ki az és milyen jogosultsága van.

Eddig úgy hajtottam végre a bejelentkezést, hogy kiolvastam minden értéket az első táblából.
Aztán, ha létezik a $_SESSION['profil_id'], akkor megnézem, van-e admin joga, aztán hogy tartozik-e hozzá kedvenc, ha igen, azokat tömbbe írom, majd tartozik-e hozzá komment, és azokat is tömbbe írom.

De ha egy LEFT JOIN-nal:
SELECT * 
	FROM ((profil 
	LEFT JOIN admin ON profil.PROFILE_ID = admin.PROFILE_ID) 
	LEFT JOIN kedvenc ON profil.PROFILE_ID = kedvenc.PROFILE_ID) 
	LEFT JOIN komment ON profil.PROFILE_ID = komment.PROFILE_ID 
	WHERE ...
Attól eltekintve, hogy használhatom a USING-ot, mert a PROFILE_ID-nek mindenhol ugyanaz a neve, teljesen kiértékelhetetlen eredményt kapok, ha pl. 5 kedvencem és 3 kommentem van. Kiad 15 sort és abból nem tudok normálisan tömbbe írni.

Ez valószínűleg az én amatőrségem, de hogy tudok ebből olyan eredményt kapni, mondjuk a kiolvasásnál a tömbbe írásnál, hogy ne 15 soros tömbjeim legyenek, hanem a kedvencek 5 sor legyen, a komment meg 3.

Köszi
 
1

LEFT JOIN

Poetro · 2010. Szep. 21. (K), 18.56
Az összes JOIN halmazművelet, ezért minden kombinációt meg fogsz kapni. Azaz ha 5 kedvenced és 3 megjegyzésed van, akkor 3 * 5, azaz 15 sort fogsz eredményül kapni, mivel minden kedvences sor esetén hozzákapcsolja az összes megjegyzést ami ahhoz a felhasználóhoz tartozik. Az általad kirakott zárójelekre egyébként nincs szükség, a lekérdezés így is ugyanebben a sorrendben fog végrehajtódni.
Amit meg szeretnél valósítani, az ebben a formában nem lesz jó. A nem összetartozó adatokat ne akard egy lekérdezésben letudni, mert a rengeteg kombinált sor miatt lassabb lesz és több memóriát is fog használni.
SELECT * FROM profil LEFT JOIN admin ON profil.PROFILE_ID = admin.PROFILE_ID WHERE ...;
SELECT * FROM profil LEFT JOIN kedvenc ON profil.PROFILE_ID = kedvenc.PROFILE_ID WHERE ...;
SELECT * FROM profil LEFT JOIN komment ON profil.PROFILE_ID = komment.PROFILE_ID WHERE ...;
2

köszi

Totti 1986 · 2010. Szep. 21. (K), 19.11
köszi a kiigazítást, így már világosabban látom.
Amúgy ugyanennél a próbálkozásomnál volt egy másik problémám.
Minden olyan embernél, aki nem admin, belépéskor lenullázza a PROFILE_ID-t.
Ugyanis kiolvas egy PROFILE_ID=5-öt a profil tömbből és kiolvas egy PROFILE_ID=NULL-t az admin táblából, mert nincs benne.

Kiolvasáskor pedig (mivel kétszer is szerepel mezőnévként, de két más értékkel) valamiért a NULL-t veszi figyelembe, és a session-ben a profile_id üres lesz. Erre van valami ötleted?
3

Mezők

Poetro · 2010. Szep. 21. (K), 19.33
* helyett add meg, mely mezők kellene neked. Mondjuk
SELECT profil.*, admin.X, admin.Y FROM profil 
  LEFT JOIN admin ON profil.PROFILE_ID = admin.PROFILE_ID WHERE ...;
4

igaz

Totti 1986 · 2010. Szep. 21. (K), 19.46
igaz, tényleg, köszi