[MEGOLDVA] MySQL lekérdezés HELP

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.

Hozzászólások

Első táblába kellene még egy csapat_id is nem?

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.

Szia!

Join háza táján nézz körbe, natural join lesz szerintem a jó barátod.

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 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`

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.


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 :)

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

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.