webForumDet fria alternativet

SQL fråga - Visa senaste raderna med ett visst värde.

Databaser & SQL

4 svar · 940 visningar · startad av Gisslen

Medlem sedan sep. 20103 inlägg
Frågan#1

Jag håller på med den hemsida som hämtar information från en MySQL-databas. Nu har jag problem att få till en SQL-query. Jag får till det med flera queries, men vill helst bara behöva använda en.

Tabellen GAME ser ut så här.
GameID
TeamID
Opponent
Date

Det är alltså en tabell med olika lags matcher, deras motståndare och vilket datum matchen är.

Det finns 3 olika lag (GameID), och varje lag har spelat flera matcher olika datum.
Nu vill jag få fram en tabell där varje lags(TeamID) senaste match visas. Tabellen ska sorteras efter TeamID.

Ex.
Tabell GAME
GameID TeamID Opponent Date
1 1 Sundsvall 2010-08-01
2 1 Hernösand 2010-08-07
3 2 Sundsvall 2010-08-06
4 3 Hernösand 2010-08-05
5 1 Timrå 2010-08-10

Önskat resultat
GameID TeamID Opponent Date
5 1 Timrå 2010-08-10
3 2 Sundsvall 2010-08-06
4 3 Hernösand 2010-08-05

Lite svårt att visa bra tabeller här, man jag hoppas att ni förstår.

Jag har jobbat med det här i flera timmar nu, men kan inte få till det. Tycker att det inte borde vara så svårt. Finns det någon här som är bra på SQL och vet hur jag ska göra?

Medlem sedan dec. 200012 464 inlägg
#2
select GameID,
       TeamID,
       Opponent,
       Date
  from game
 where gameid = 
    (select max(gameid)
         from game as g
        where g.teamid = game.teamid)
 order by date desc
Medlem sedan sep. 20103 inlägg
#3

Tack för svar, LarsG!
Det börjar närma sig. Misstänkte att det var en nested query som gällde, men fick inte alls till det själv.

Din kod fungerar bra, men det blir en liten bugg. Om jag lägger in en ny match i tabellen med ett datum som är längre tillbaka i tiden än den senaste matchen, så kommer den att visas istället.
Det blir alltså inte de senaste matcherna utifrån datum som visas, utan de senaste inlagda matcherna i tabellen.

Bör inte vara några större ändringar som behöver göras. Sitter och filar på en lösning. Lägger in den här om jag lyckas, men jag tar gärna mot mer hjälp :)

Medlem sedan dec. 200012 464 inlägg
#4
select GameID,
       TeamID,
       Opponent,
       Date
  from game
 where date = 
    (select max(date)
         from game as g
        where g.teamid = game.teamid)
 order by date desc

Jag använde gameid för att undvika att få flera poster om ett lag hade flera matcher på samma datum. Det kanske inte är något problem.

Medlem sedan sep. 20103 inlägg
#5

Tack! Nu funkar det bra.

Jag lyckades få till något liknande med en lite annorlunda query. Men din kanske är effektivare.

Jag använde denna nästlade query:

GameID = (SELECT GameID
 FROM      game as g
 WHERE     g.TeamID = game.TeamID
 ORDER BY  Date DESC
 LIMIT 1)

Men din med max(Date) istället för ORDER BY Date och en LIMIT kanske är bättre som sagt...

Hur som helst. Jag är ytterst tacksam LarsG. Skönt att slippa slita sig i håret ännu mer. :birp

EDIT:
Det är sällan ett lag spelar två matcher på samma dag, så det spelar ingen roll hur det blir då.

EDIT 2:
Jo, det spelade visst roll. :r
Märkte att om ett lag har spelat två matcher på samma dag så visas båda matcherna. Hade bara ena visats, oavsett vilken, hade det inte spelat så stor roll. Men om båda visas så blir det fel på layouten på hemsidan. Med min inre query så blir det bara en p.g.a. limiten. Så jag kör på den.

253 ms totalt · 4 externa anrop · v20260731065814-full.bd618308
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)