[MySQL] Uitgebreide, gelimiteerde query

Pagina: 1
Acties:

  • ERIKvanPAASSEN
  • Registratie: September 2006
  • Laatst online: 20-09 10:12
Ik heb een probleem. Mijn kennis van SQL is niet toereikend voor het volgende probleem. Het lijkt erg simpel, maar wanneer ik m'n code ga bouwen, valt het toch erg tegen.

Omschrijving van de situatie:
Het probleem omvat een competitiemanager. In competities zitten teams, deze hebben wedstrijden. (:+) En deze wedstrijden bestaan ook weer uit meerdere subwedstrijden.

Alle wedstrijden staan van tevoren in het systeem, subwedstrijden worden aangemaakt als de wedstrijd is gespeeld, en dus de uitslag bekend is.

Nu wil ik de laatste uitslag per team displayen, gesorteerd op datum.

Er zijn tabellen:
  • teams
  • wedstrijden, gelinkt aan teams (teams.id = wedstrijden.team)
  • subwedstrijden, gelinkt aan teams (wedstrijden.id = subwedstrijden.team_match)
De voorwaarden dus:
  • Er bestaan subwedstrijden voor de wedstrijd (geeft aan dat de wedstrijd is gespeeld)
  • Eén wedstrijd, met de hoogste datum, per team
  • Gesorteerd op datum, aflopend
Mijn SQL so far:

SQL:
1
2
3
4
5
SELECT teams.textname AS team, wedstrijden.id AS id, wedstrijden.datum AS datum, wedstrijden.opponent AS opponent, wedstrijden.home AS home, count(subwedstrijden.id) AS submatches, sum(won) AS won
FROM wedstrijden, subwedstrijden, teams
WHERE wedstrijden.id = subwedstrijden.team_match AND wedstrijden.team = teams.id
GROUP BY wedstrijden.id
ORDER BY wedstrijden.datum DESC

Sorry voor het gekloot met zowel Nederlandse als Engelse termen. 8)7

Deze SQL geeft alle uitslagen per team, hoe kan ik zorgen dat dat alleen de laatste is per team? |:( (LIMIT 1 op het einde werkt natuurlijk niet.)

Verwijderd

:/

[ Voor 99% gewijzigd door Verwijderd op 24-12-2006 20:07 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ik heb je vraag even snel globaal bekeken, en volgens mij is wat je wilt enkel mogelijk middels een subselect die per gevonden team uitgevoerd wordt.
Je kunt met LIMIT immers enkel de gehele resultset van een query limiteren, en niet het aantal gevonden records van een join. Door met een subselect kun je de records die middels een join gevonden worden wel limiteren.

  • ERIKvanPAASSEN
  • Registratie: September 2006
  • Laatst online: 20-09 10:12
OK B-Man, Google ik daar even op. Alvast bedankt. :P

[ Voor 82% gewijzigd door ERIKvanPAASSEN op 24-12-2006 20:28 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
ERIKvanPAASSEN schreef op zondag 24 december 2006 @ 20:19:
OK B-Man, Google ik daar even op. Alvast bedankt. :P
Niet getest (heb je data + format niet), maar even een globaal opzetje:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    t.textname AS team, 
    w.id AS id, 
    w.datum AS datum, 
    w.opponent AS opponent, 
    w.home AS home, 
    count(sw.id) AS submatches, sum(sw.won) AS won 
FROM teams AS t, wedstrijden AS w, subwedstrijden AS sw
WHERE w.team = teams.id AND sw.team_match = w.id 
    AND w.id = (
        SELECT id FROM wedstrijden w2
        WHERE w2.team = t.id
        ORDER BY w2.datum DESC
        LIMIT 1
    )
GROUP BY w.id
ORDER BY t.id

Zie ook: http://dev.mysql.com/doc/...ons-using-subqueries.html (ik weet niet op welke database je draait, MySQL, PostgreSQL, ...?)

In bovenstaande query vraag je dus per team maar een wedstrijd op, die middels een subquery gevonden wordt op basis van de teaminfo.

  • ERIKvanPAASSEN
  • Registratie: September 2006
  • Laatst online: 20-09 10:12
Zie ook: http://dev.mysql.com/doc/...ons-using-subqueries.html (ik weet niet op welke database je draait, MySQL, PostgreSQL, ...?)
MySQL, staat in de topictitel. :P

Bedankt voor het voorbeeld, ik ga 'm ff proberen.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
ERIKvanPAASSEN schreef op zondag 24 december 2006 @ 20:29:
[...]


MySQL, staat in de topictitel. :P
Ai, ai, ai ;) Tijd om wat anders te gaan doen. Succes met je query!

  • ERIKvanPAASSEN
  • Registratie: September 2006
  • Laatst online: 20-09 10:12
't Heeft een tijdje geduurd voordat ik zag hoe ik 'm moest linken, maar aanschouw: :+
De Oplossing O+

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT
   t.textname AS team,
   w.id AS id,
   w.datum AS datum,
   w.opponent AS opponent,
   w.home AS home,
   count(sw.id) AS submatches,
   sum(sw.won) AS won
FROM teams AS t, wedstrijden AS w, subwedstrijden AS sw
WHERE
   w.id = sw.team_match
   AND w.team = t.id
   AND w.datum = (
      SELECT
         max(w2.datum) AS laatste
      FROM wedstrijden AS w2, subwedstrijden AS sw2
      WHERE
         w2.id = sw2.team_match
         AND w2.team = t.id
      )
GROUP BY t.id
ORDER BY w.datum DESC


De subquery zoekt de laatste uitslag op voor een team.

B-Man, heel erg bedankt! Zonder jou had 't nog een maandje geduurd voordat ik erachter zou komen. :X
Pagina: 1