MySQL egy tábla kapcsolása több rekordhoz
Sziasztok!
Van egy sql táblám. A tábla szerkezete:
tábla neve: kliens
ID
szulhely
varos
Másik tábla:
tábla neve: varos
ID
varosnev
A gondom az, hogy a kliens táblába a szulhely, és varos rekordját kéne összekötnöm a varos táblával. Van erre lehetőség, vagy marad az a megoldás, hogy külön lekérdeztetem?
■ Van egy sql táblám. A tábla szerkezete:
tábla neve: kliens
ID
szulhely
varos
Másik tábla:
tábla neve: varos
ID
varosnev
A gondom az, hogy a kliens táblába a szulhely, és varos rekordját kéne összekötnöm a varos táblával. Van erre lehetőség, vagy marad az a megoldás, hogy külön lekérdeztetem?
Szia! Amit Te keresel, azt
Amit Te keresel, azt idegen kulcsok kezelésének hívják. A kliens táblába kell, hogy legyen egy mező, ami a város táblára hivatkozik, méghozzá egy idegen kulccsal. A kliens táblában nem a város nevét kell letárolnod, hanem, a város táblában szereplő város ID-ját. Első körben a kliens táblában lévő varos mezőt átnevezném varos_id-ra, csak hogy tudd később, hogy ott egy kulcsot tárolsz, nem pedig más értéket
A lekérdezésben, ahol szeretnéd lekérdezni a várost is, JOIN-olnod kell az idegen táblát. Ezt megoldhatod több JOIN típussal is.
Egy nem tesztelt példa INNER JOIN-nal - remélem, hogy működik:
v => varos tábla alias
Ha minden jól megy, akkor egy rekordban vissza kell hogy kapd a kliens összes adatát + a hozzárendelt város nevét is. A listádat tovább tudod szűrni további WHERE feltételekkel, tudod sorba rendezni, stb..
köszi szépen. Amit írtál, a
Egy picit elvesztettem a
Eyg rekordnak nem lehet int típusa. Talán a "varos" mezőre gondoltál? Az már lehet int, jobban mondva ugyanaz kell, hogy legyen a típusa, mint a varos tábla ID-mezőjének.
Nem teljesen értem. Milyen rekordok vannak konkrétan a két táblában? Esetleg le tudnád írni, hogy konkrétan a képernyőre mit szeretnél kiíratni?
Így néznek ki konkrétan a
kliens.szulhely -> varos.varosnev
kliens.varos -> varos.varosnev
Ha jól értem, akkor nincs más
Nem nagyon egyszerűsíthető
Melyik részével vagy elégedetlen? Ilyen egyszerű selectet szerintem nem lehet tovább optimalizálni. Persze egy hajszálnyival egyszerűbben lehetne írni a nem kötelező kulcsszavak kihagyásával, pl. így:
Üdv:
Dávid
Hello Dávid, nem vagyok egy
nem vagyok egy SQL guru, csak haverkodtunk már párszor.. :) Duplikáltnak éreztem a varos tábla joinolását, ezért gondoltam arra, hogy esetleg van szebb megoldás. Köszönöm egyébként a választ!
üdv,
S
Mi az egyszerű
Ez nagyon nézőpont kérdése, hogy kinek mi az egyszerűbb. Ugye itt nem optimalizálásról van szó, a MySQL szervernek mindegy, hogy kiírod-e az
INNER
-t vagy nem. Azonban egy másik embernek, aki szemmel próbálja elolvasni a lekérdezésedet, semennyit nem segít az, hogy kevesebb karakter, sőt, van akinek pár ms-al több idő így megérteni, mert magában hozzá kell tennie a default join fajtát... :)Igen ez működik :) viszont
Mindent a nevén
Aztán nagyon nem szerencsés egy query-n belül különböző dolgokra (tábla vs oszlop) azonos alias-al hivatkozni. Ebből hatalmas keveredés és hibák tömege lehet később, amikor "kicsit nagyobb" lekérdezéseket fogsz írni.
Én azt sem tartom feltétlenül jó ötletnek, hogy 1-2 betűs aliasokat használj, lehet pl úgy is, hogy itt a varos táblát kell kétszer "megemlíteni", hát legyen varos1 és varos2.
A második query-ben hiányzik a FROM kliens után a 'k' alias, így a join kapcsolója hibás.
Ha megnézed ezt:
Mindenképpen érdemes egy jó koncepciót követni minden query megírásához, akkor egységes és (legalább számodra) a későbbiekben is átlátható kódod lesz. Ha itt (v bárhol) más külalakban kapsz valami megoldást, azt is mindig "fordítsd le" a saját kocepciód szerint, míg ezt teszed, te is fejlődsz + eszedbe juthatnak még jobb ötletek.