ugrás a tartalomhoz

Összetett lekérdezés

gabeekex · 2010. Már. 25. (Cs), 14.13
Sziasztok!

A problémám a következő:

Szeretnék készíteni egy dinamikus tabellát. Létrehoztam hozzá egy adatbázist, ami a következőképpen néz ki:
----------------
csapatok tábla
----------------
-id
-nev
----------------

----------------
eredmeny tábla
----------------
-eredmeny_id
-csapat_id
-meccs_id
-goal
-statusz
----------------


----------------
meccs tábla
----------------
meccs_id
csapat_id_1
csapat_id_2
----------------

A csapat tábla a bajnokságban résztvevő csapatokat tartalmazza, és az id-vel kapcsolódik az eredmény táblához, ahol van egy meccs azonosító (hogy melyik meccsen szerezte az adott csapat a gólokat), van egy gól tároló (goal) és van egy státusz, amihez 1 2 vagy 3 kerül aszerint hogy a csapat győzött x-elt vagy vesztett.
A meccs tábla pedig a meccs id alapján kapcsolódik az eredmény táblához és két csapatnevet tartalmaz, akik egymással játszottak.

Végeredményben szeretnék kiiratni egy táblázatot:

csapatnév | meccsek száma | győzelmek száma | döntetlenek száma | vereségek száma

rúgott gólok | kapott gólok | gólkülönbség | pont (SUM(győzelem*3)+SUM(döntetlen))

A cél az lenne, hogy ezeket az adatokat pont szerinti sorrendben kilistáztassam.

A lekérdezéseket külön külön meg tudom írni, helyes eredményt kapok.

pl.:

Kapott gól:

SELECT SUM( goal )
FROM eredmeny
INNER JOIN meccs ON eredmeny.m_id = meccs.m_id
AND (
meccs.cs_id = '1'
OR meccs.cs_id_2 = '1'
)
WHERE eredmeny.cs_id != '1'

Viszont ha külön lekérdezéseket futtatok, akkor nem tudom egy táblázatba rendezni az eredményeket pontok szerint. Vagy van erre valami megoldás? Egy összetett lekérdezés ennyi lekérdeznivaló esetén pedig szerintem nem megoldható. Vagy mégis? Mi lenne a jó megoldás?

A válaszokat előre is köszönöm.
 
1

Nem értem

Poetro · 2010. Már. 25. (Cs), 21.17
Szóval minden meccs kétszer szerepel az eredmények táblában?
A nagyrésze megkapható egy lekérdezéssel:
SELECT
  SUM(goal) as golok,
  SUM(IF(statusz = 1, 1, 0)) AS gyozelmek,
  SUM(IF(statusz = 2, 1, 0)) AS dontetlenek,
  SUM(IF(statusz = 3, 1, 0)) AS vesztesegek,
  SUM(IF(statusz = 1, 3, IF(statusz = 2, 1, 0))) AS pontok,
  e.nev,
  e.csapat_id
FROM eredmeny AS e
  INNER JOIN csapatok AS cs ON cs.csapat_id = e.eredmeny_id
GROUP BY e.csapat_id
Mivel a kapott gólok, és a gólkülönbség sokkal bonyolultabb, valami ilyesmi lenne:
SELECT
  SUM(e1.goal) + SUM(e3.goal) AS kapott_golok,
  SUM(e1.goal) + SUM(e3.goal) - SUM(e2.goal) - SUM(e4.goal) AS golkulonbseg,
  cs.nev,
  cs.id  
FROM csapatok AS cs
  INNER JOIN meccs AS m1 ON m1.csapat_id_1 = cs.id
  INNER JOIN eredmeny AS e1 ON e.csapat_id = m1.csapat_id_2
  INNER JOIN eredmeny AS e2 ON e.csapat_id = m1.csapat_id_1
  
  INNER JOIN meccs AS m2 ON m1.csapat_id_2 = cs.id
  INNER JOIN eredmeny AS e3 ON e.csapat_id = m1.csapat_id_1
  INNER JOIN eredmeny AS e4 ON e.csapat_id = m1.csapat_id_2
GROUP BY cs.id;
2

Köszönöm szépen, sokat

gabeekex · 2010. Már. 25. (Cs), 22.41
Köszönöm szépen, sokat segítettél :)