WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL group by (https://www.wn.se/forum/showthread.php?t=32157)

allstars 2008-09-25 09:08

Jag har en tabell innehållandes lopp som går runtom i Sverige (västsverige mestadels, faktiskt) och en tabell innehållandes mina resultat.

Jag har försökt att filtrera ut så att jag bara får ut de tiderna jag haft bäst (minst tid) på 10KM och gruppera på år för att få ut årsbästa.

Så här skrev jag:
Kod:

SELECT MIN(`r`.`time`), `e`.`name`, `e`.`length`, `e`.`date`
`myDate`, YEAR(`e`.`date`) `myYear` FROM `results` `r`
INNER JOIN `events` `e` ON `e`.`ID`= `r`.`eventID`
WHERE `r`.`userID`=1 AND `e`.`length`=10
GROUP BY YEAR(`e`.`date`)
ORDER BY `myYear` ASC, `r`.`time` ASC

Tiderna som kommer ut stämmer, men inte loppen som tiderna skall vara knutna till.

Kod:

MIN(`r`.`time`) name  length myDate myYear
00:41:45 Sylvesterloppet 10.0 2004-12-31 2004
00:42:58 Göteborg Cross Country 10.0 2005-04-09 2005
00:40:54 Göteborgs Cross Country 10.0 2006-04-29 2006
00:42:00 Blodomloppet Göteborg 10.0 2007-05-30 2007
00:40:48 Lerumsloppet        10.0 2008-04-26 2008



Så här skall resultatet bli (jag har själv tagit ut dessa rader manuellt)
Kod:

time        name        length myDate myYear
00:41:45 Sylvesterloppet 10.0 2004-12-31 2004
00:42:58 Lerumsloppet        10.0 2005-04-23 2005
00:40:54 Blodomloppet Göteborg 10.0 2006-05-31 2006
00:42:00 Sylvesterloppet 10.0 2007-12-31 2007
00:40:48 Blodomloppet Göteborg 10.0 2008-05-28 2008


Någon som har en idé vad det kan vara som är galet?

Det är MySQL5 som körs.

Magnus_A 2008-09-25 10:26

Min() plockar bara ut minvärdet och inte en specifik rad där minvärdet återfinns. Därför kan du inte använde det för en koppling.
När du gör en group by så plockar mysql ut rader efter hur de råkar ligga i tabellen och inte efter nån slags ordning som man kan ange. Ett sätt att komma runt detta är att använda en subquery som tar fram den ordning som du vill ha, eller endast den rad som du vill ha med.

allstars 2008-09-25 10:56

Så först göra en loop där jag får ut de år jag har resultat på 10Km och sedan ta ut den bästa (lägsta) tiden det året, borde fungera. Dock hade det varit optimalt att bara ha en query.

martine 2008-09-25 12:48

Citat:

Originally posted by allstars@Sep 25 2008, 10:56
Så först göra en loop där jag får ut de år jag har resultat på 10Km och sedan ta ut den bästa (lägsta) tiden det året, borde fungera. Dock hade det varit optimalt att bara ha en query.

Det ska nog inte vara något problem att göra det till en sql-fråga, loopar är ju lite korkat. (Med MySQL5 kan man också använda subqueries osv. (som Magnus_A nämnde) till att baka ihop enorma frågor.)

Med typ SELECT MIN(tid) AS topptid, evenemang, år GROUP BY år,evenemang eventuellt med någon HAVING borde du väl kunna få fram vad du letar efter (har inte riktigt förstått vad du vill få ut). Det är lite jobbigt att läsa querien med alla "flärpar" - finns det någon speciell anledning till att ha det så (förutom att du använder funktionsnamn som fältnamn)?

Magnus_A 2008-09-25 13:54

Finns ett exempel i manualen:
http://dev.mysql.com/doc/refman/5.0/en/exa...-group-row.html

allstars 2008-09-26 10:27

spännande... Tack!


Alla tider är GMT +2. Klockan är nu 21:27.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson