A foci vb kapcsán futottam bele egy feladatba (egy tippjáték), adott 2 tábla:
- az elsőben vannak a csapatok adatai: id, nev, logo
- a masodikban a vb meccsek adatai: id, hazai_id, vendeg_id, haza_gol, vendeg_gol, datum, ido
Ebből kellene nekem egy olyan tablázatot lekérnem, aminek a következő a formátuma:
datum, ido, "hazai_nev" - "vedeg_nev", hazai_gol - vendeg_gol
Ebben szeretném kérni egy MySQL guru segítségét, aki tudan nekem egy hasznalható SELECT parancsot kreálni, erre a lekérdezésre. Még csak most ismerkedem az sql-el.
- 1254 megtekintés
Hozzászólások
Első táblába kellene még egy csapat_id is nem?
- A hozzászóláshoz be kell jelentkezni
Az első táblában lévő id az a csapat id. A második táblában lévő id az a meccs id. A meccsek adatai a második táblában úgy vannak, hogy a csapatok id-je szerepel, nem pedig a nevük. Azt szeretném, ha a lekérdezéskor az eredményben a csapatok neve szerepeljen és az eredmény.
- A hozzászóláshoz be kell jelentkezni
Szia!
Join háza táján nézz körbe, natural join lesz szerintem a jó barátod.
- A hozzászóláshoz be kell jelentkezni
Valami ehhez hasonló kell neked (nem teszteltem):
SELECT `meccs`.`datum`, `meccs`.`ido`, `hazai_csapat`.`nev` AS `hazai_nev`, `vendeg_csapat`.`nev` AS `vendeg_nev`, `meccs`.`hazai_gol`, `meccs`.`vendeg_gol` FROM `meccsek` AS `meccs` LEFT JOIN `csapatok` AS `hazai_csapat` ON `meccs`.`hazai_id` = `hazai_csapat`.`id` LEFT JOIN `csapatok` AS `vendeg_csapat` ON `meccs`.`vendeg_id` = `vendeg_csapat`.`id`
- A hozzászóláshoz be kell jelentkezni
Húha, ezen mire átrágom magam...
- A hozzászóláshoz be kell jelentkezni
A left join a titka.
Left join-nal hozzá tudsz csatolni egy tábla soraihoz egy másik tábla egy (vagy több) sorát egy (vagy több) feltétel alapján, amit az ON után adsz meg. 2 left join is van benne, mert a hazai és az idegen csapatot is ki kell szedni.
Mi van még benne: AS - ezzel alias-t adsz valaminek (mezőnek, táblának).
Így talán egyszerűbb átlátni:
SELECT *
FROM `meccsek` AS `meccs`
LEFT JOIN `csapatok` AS `hazai_csapat` ON `meccs`.`hazai_id` = `hazai_csapat`.`id`
LEFT JOIN `csapatok` AS `vendeg_csapat` ON `meccs`.`vendeg_id` = `vendeg_csapat`.`id`
- A hozzászóláshoz be kell jelentkezni
Megelőztél. :)
- A hozzászóláshoz be kell jelentkezni
Köszönöm a gyors válaszokat, próbálkozom...
Ez idáig remek, de sajnos az eredményben még mindig a csapatok id száma szerepel a neve helyett... :(
- A hozzászóláshoz be kell jelentkezni
eleg szajbaragosan leirtak a forumtarsak, szoval kicsit izzadj meg vele, es akkor szolj, ha kesz vagy.
t
- A hozzászóláshoz be kell jelentkezni
Igen a válasz kimerítő, de sajnos az eredmény nem olyan, amilyet szeretnék... lehet rosszul írtam le a problémát. Megpróbálom szemléltetni:
CSAPAT:
csid_____nev
___1_____nemetorszag
___2_____anglia
___3_____hollandia
MECCSEK:
mid______hazaid_____vendegid______hazaigol_____vendeggol
__1___________1____________2_____________5_____________3
__2___________2____________3_____________2_____________3
__3___________3____________1_____________2_____________4
EREDMENY:
nemetorszag-anglia_______5-3
anglia-hollandia_________2-3
hollandia-nemetorszag____2-4
amikkel próbálkoztam, ott minden esetben az eredményben nem a csapat nevet hanem az id-t kaptam vissza.
- A hozzászóláshoz be kell jelentkezni
Másold be az általad használt lekérdezést, az alapján többet fogunk tudni mondani.
- A hozzászóláshoz be kell jelentkezni
SELECT
CONCAT( HCS.nev, "--", VCS.nev ) AS resztvevok,
CONCAT( M.hazaigol, "-", M.vendeggol ) AS eredmeny
FROM MECCSEK M
LEFT JOIN CSAPAT AS HCS ON M.hazaid = HCS.csid
LEFT JOIN CSAPAT AS VCS ON M.vendegid = VCS.csid
Korrekten leírták korábban a többiek, ld. például gergoerdosi magyarázatát a működésről, ez formájában is kb. olyan, mint amit szeretnél. Concat összefűzi a zárójelben lévő szövegdarabokat; HCS=helyi csapat, VCS=vendégcsapat, M a meccsek táblára egy álnév itt, az AS után lehet ilyen álneveket (alias) megadni, lusta programozók szeretik használni kilométerhosszú hivatkozások helyett :)
- A hozzászóláshoz be kell jelentkezni
megcsináltam a fenti 2 táblát és teljesen jó a query-d, annyit változtattam rajta, hogy a "MECCSEK M"
helyett
"MECCSEK AS M"
került bele.
illetve a táblákat kisbetűsen hoztam létre és a query-ben is így szerepelnek, tehát "meccsek" és "csapat", ez valamiért felizgatta a mysql-emet
- A hozzászóláshoz be kell jelentkezni
Köszönöm a segítséget előre is. Még nem volt időm tesztelni, de szerintem innen már menni fog.
Szerk. megy. Tényleg köszönöm a segítséget, de azt hiszem elolvasok egy-két MySQL könyvet.
- A hozzászóláshoz be kell jelentkezni
Márpedig ilyen eredmények nem születtek, azért nem megy. :)
----------------
(Működésképtelen) processzorokat gyűjtök. Ha van, msg me!
- A hozzászóláshoz be kell jelentkezni
Nem olyan nehéz... Leegyszerűsítve:
SELECT (mezok) FROM meccsek AS meccs
Vagyis lekérdezed a megadott mezőket a meccsek táblát használva alapul, amelyet meccs-nek nevezel el (ez akár nem is szükséges), majd hozzá csatolod a csapatok táblát az id-k alapján:
LEFT JOIN csapatok AS hazai_csapat ON meccs.hazai_id = hazai_csapat.id
LEFT JOIN csapatok AS vendeg_csapat ON meccs.vendeg_id = vendeg_csapat.id
Így talán átláthatóbb egy kicsit.
- A hozzászóláshoz be kell jelentkezni