ugrás a tartalomhoz

(LEFT) JOIN?

Dualon · 2004. Okt. 29. (P), 00.55
Sziasztok!

Igyekeztem általános fórumnevet választani, mert bár lehet, hogy ezúttal nem a JOIN lesz a megoldás, így a későbbiekben is alkalmazható lesz a "terem" e kényes területtel kapcsolatban. A lényeg: remélem, senkit nem vezet tévútra a téma címe a megoldás keresésekor.

Adott három tábla, mondjuk t1, t2, t3.
t1:
- id_t1
- turista

t2:
- id_t2
- hely

t3:
- id_t3
- fenykep

Azt szeretném megoldani, hogy t1-ből kiválasszon egy adott azonosítóhoz tartozó sort, t2-ből szintén, és t3-ból is kiválasszon egyet, ha létezik...
t1-ben és t2-ben biztosan szerepel a megfelelő 1-1 sor, t3-ban viszont lehet, hogy van megfelelő, lehet, hogy nincs. t3-mal kapcsolatban az információt a meglét/nemlét hordozná, tehát csupán annyit szeretnék tudni, van-e megfelelő sor a táblában.
(Egy bizonyos turistánk biztosan járt egy adott helyen, de nem tudjuk, készített-e képet.)

Megoldható ez egy lekérdezésben? A LEFT JOIN-nal szenvedtem idáig, de egyszerűen nem jövök rá a megoldásra.

(Lehet, hogy hülye kérdés, de már átolvastam a weblaboron végzett keresés találatait, néztem a google-ön az eredményeket, meg persze manualt oda-vissza, és már kitépkedtem az összes hajam... :)

Előre is köszönöm!
 
1

kapcsolo tablak

Jano · 2004. Okt. 29. (P), 02.01
gondolom van kapcsolotabla is mert kulonben hogy tarolod, hogy ki hol volt

tehat a negyedik tabla a latogatas tabla:
*latogatas_id,
-turista_id,
-hely_id,
(itt mege lehet esetleg datum pl hogy mikor volt ott...)

Az otodik tabla pedig osszakpcsolja a latogatast a fotoval.
* t5_id
- foto_id
- latogatas_id

Ezekutan mar csak t4 es t5 talat kell joinnolni es ha van sora akkor keszitett fotot.
2

Kis kötözködés

PiG · 2004. Okt. 29. (P), 09.23
* t5_id
- foto_id
- latogatas_id

Ha a te megoldásod szerint járunk el, és amennyiben a * az elsődleges kulcsot jelzi (de egyébként is), szerintem felesleges a t5_id mező felvétele. A latogatas_id -k és foto_id -k önmagukban is egyediek, és a kettő együtt meg pláne, hiszen ugyanazon látogatásnál nem lehet kétszer ugyanazt a fotót megcsinálni (ugyanazt le lehet fényképezni persze még egyszer, de azért ez már egy másik fotó). A tábla sorai tehát egyértelműen azonosíthatók e két mezővel. A JOIN-nál is a latogatas_id szerepel kulcsként, a t5_id-t fel sem használnánk. Ilyen jellegű kapcsolótábláknál szerintem felesleges külön elsődleges kulcs mező felvétele.
Javítsatok ki, ha tévednék...

Sziasztok:
P][G
3

Köszönöm - és a megoldás...

Anonymous · 2004. Okt. 29. (P), 14.32
Sziasztok!

Köszönöm hozzászólásaitok!
Való igaz, azt elfelejtettem leírni, hogy a táblákat meglévő id-ken át kapcsolom (illetve adott, konkrét értékkel). Ennek megfelelően tehát:
t1:
- id_t1 (fix értéket kap)
- turista

t2:
- id_t2 (fix értéket kap)
- hely

t3:
- id_t3
- fenykep
- turista_id (<- kimaradt)

Pusztán a probléma leírása már segített annyit, hogy végül - ha minden igaz - rájöttem a megoldásra:

SELECT t1.*, t2.*, t3.id_t3
FROM turistak t1
LEFT JOIN helyek t2 ON t2.id_t2=1
LEFT JOIN fenykepek t3 ON t3.turista_id = t1.id_t1
WHERE t1.id_t1=2


Ez persze felvet egy kérdést: jól értettem a feltételek használatát? Ez a megoldás így jó? (Működni látszik, de attól még rejthet elvi hibát.)
Előre is köszönöm!
4

Előző is én voltam...

Dualon · 2004. Okt. 29. (P), 14.33
Elnézést, az előző is én voltam.
5

nincs benne

Jano · 2004. Okt. 29. (P), 15.38
Ha a t3 igy nez ki akkor nincs tarolva, hogy HOL keszitette az adott turista a kepet.

Egyebkent LEFT JOIN helyett INNER JOIN jobb lenne neked.

LEFT JOIN eseten elso tablabol visszadja azokat a sorokat is amire nem volt par, INNER JOIN-nal viszont csak azokat ahol volt.

Igy csak akkor kapsz vissza talalatot ha van kep a turistahoz.

Pig: igen valszeg folosleges a t5_id.
6

...

Dualon · 2004. Okt. 29. (P), 15.59
A turista és a hely adott, azokat ismerem (a lekérésben is ezért írtam fix értéket).
Az INNER JOIN-t pedig kipróbálom, köszönöm!
7

az lehet

Jano · 2004. Okt. 29. (P), 16.12
Lehet hogy te ismered de a tudas nincs benne az adatbazisban.
Illetve pontosabban:
A lekerdezesed eredmenye szerintem:
Az OSSSZES kep attol a turistatol akinek 2 az ID-je es volt az 1-es ID-ju helyen.

Tehat a turista osszes kepe es nem csak azok amik az adott helyen keszultek.
8

v2.0 :)

Dualon · 2004. Okt. 29. (P), 17.58
Igaz! Pontosított tábla és lekérdezés:

t3:
- id_t3
- fenykep
- turista_id
- hely_id (<-)

SELECT t1.*, t2.*, t3.id_t3
FROM turistak t1
LEFT JOIN helyek t2 ON t2.id_t2=1
LEFT JOIN fenykepek t3 ON (t3.turista_id = t1.id_t1) AND (t3.hely_id = t2.id_t2)
WHERE t1.id_t1=2


Így korrekt?
9

logikailag nem

Jano · 2004. Okt. 30. (Szo), 11.58
Nem jol szervezed az adatbazist.

Ha egy felhasznalo nem keszitett kepet akkor fogalmad se lesz, hogy jart-e egy adott helyen!

Left join helyett pedig javasoltam az inner joint az eredeti problemara.
10

Akkor még ügyködök rajt...

Dualon · 2004. Okt. 30. (Szo), 13.16
Értem, köszönöm! Akkor még dolgozom rajt.