webForumDet fria alternativet

SQL hjälp - Den bästa tiden för varje förare...

Databaser & SQL

14 svar · 363 visningar · startad av Viktor

Medlem sedan aug. 20021 752 inlägg
Frågan#1

Hej

Jag har en databas där jag har följande tabeller (visar bara relevanta kollumner)

driver - id
track - id
time - id, driver id, track id, time (int)

Varje förare kan skriva in många tider för samma bana och självklart kan det finnas flera förare som kör på samma bana.
Nu vill jag fåut den bästa tiden från varje förare på en speciell bana, dvs bästa tid på bana 1 av förare 1, förare 2, förare 3 osv. Går det att lösa med SQL eller måste jag fortsätta som jag gör idag med att hämta allt med order by och gallra ut i koden? Eller kan jag göra om databas designen på något sätt så det blir bättre?

/Viktor

Medlem sedan juni 20003 076 inlägg
#2

Databasdesignen är det inget fel på.
Jag tog med förarnamn och bannamn också, gissar att de finns!

strSql = "Select D.DriverName, T.Time, Tr.TrackName From " & _
"Driver D Inner Join Time T On D.Id = T.DriverId " & _
"Inner Join Track Tr On T.Trackid = T.Id " & _
"Where Tr.Id = " & Trackid &  " " & _
"Order By T.Time ;"
Medlem sedan aug. 20021 752 inlägg
#3

Tyvärr så blir det ändå inte som jag vill ha det :(
Med den koden så får jag ut alla tider för alla förare, inte bara den bästa, måste alså fortfarande sortera ut alla dubleter i koden.
Såhär blev SQL stsen för mig (kanske skrivit fel någon stans),

select d.name, t.time, t.track
from gp4_drivers d
inner join gp4_times t on d.id = t.driverId
inner join gp4_tracks tr on t.trackId = tr.id
where tr.id = 10
order by t.time

och resultatet blev

name,time,track
Labonte,73637,10
Cool,73976,10
Labonte,74044,10
Labonte,74563,10
Cool,74666,10
petri99,74845,10
Labonte,75013,10
Cool,75433,10
Viktor,75741,10

Jag vill altså bara ha med 1 tid, den bästa från varje förare.

/Viktor

Medlem sedan feb. 20022 594 inlägg
#4

Nu har inte jag kollat igenom riktigt, men jag gissar att det är typ

select distinct d.name, ...

som du är ute efter?

Medlem sedan aug. 20021 752 inlägg
#5

Hjälper tyvärr inte :(
btw kör MySQL.

/Viktor

Medlem sedan dec. 200012 464 inlägg
#6
select min(time) as bestTime, driverid,trackid
  from time
 group by driverid,trackid
Medlem sedan aug. 20021 752 inlägg
#7

LarsG skrev:

select min(time) as bestTime, driverid,trackid
  from time
 group by driverid,trackid

Så kompakt och så rätt! :)
Tack!

/Viktor

Medlem sedan aug. 20021 752 inlägg
#8

Ett litet tillägg :)
Kan man få den sorterad på tiden? Så den bästa (lägsta) tiden kommer först? Nu är det sorterat på föraren.

select min(time) as bestTime, driverid,trackid
  from time
 group by driverid,trackid

/Viktor

Medlem sedan dec. 200012 464 inlägg
#9
select min(time) as bestTime, driverid,trackid
  from time
 group by driverid,trackid
 order by bestTime
Medlem sedan aug. 20021 752 inlägg
#10

Tack igen :)

Det var ju inte så svårt, försökte med "order by time" men då blev det helt fel :)

/Viktor

Medlem sedan aug. 20021 752 inlägg
#11

Nu är jag här igen och kräver mer hjälp :)

Nu vill ja få ut det som jag får ut ovan men jag vill även att de förare som inte har något tid också ska komma med i listan. Dvs jag vill ha alla förare med i listan och bästa tiden för en förare om den har kört, om den inte har kört blir det väll null där eller något annat.

Hoppas någon förstår och vet hur man sak göra :)

/Viktor

Medlem sedan dec. 200012 464 inlägg
#12

Var har du lagrat alla drivers då?

select min(time) as bestTime, d.driverid,trackid
  from dirvers d left outer join time t
  on d.driverid = t.driverid
 group by d.driverid,trackid
 order by case when t.driverid is null then 1 else 0 end,
 besttime
Medlem sedan aug. 20021 752 inlägg
#13

Wow! Vad jag är förvånad att det fungerar perfekt :e
Tack igen!
Kanske dags att lägga ut lite mer info om databasen, det kommer kanske fler frågor :)

gt3_driver
  id,name,password,team_id,user_type

gt3_team
  id,name

gt3_time
  id,time,driver_id,track_id,post_date

gt3_track
  id,race_name,track_name,race_type,track_pic,start_date,end_date

/Viktor

Medlem sedan aug. 20021 752 inlägg
#14

Fungerade inte så bra ändå :(

SELECT min(t.time) as bestTime, t.id, t.driver_id, t.track_id, t.post_date, team.name as team_name, driver.name as driver_name
FROM gt3_time t, gt3_driver driver, gt3_team team 
WHERE t.track_id=6 AND t.driver_id=driver.id AND driver.team_id=team.id
GROUP BY driver_id,track_id
ORDER BY bestTime

Det här är den SQL som jag använder och den är baserad på det första svaret som LarsG skrev. Jag får ut den bästa tiden för varje förare osv, MEN t.id är inte id't för den bästa tiden, t.post_date är inte post_date för den bästa tiden. Hur ska man fixa så att det blir rätt?

/Viktor

Medlem sedan dec. 200012 464 inlägg
#15

Hanteringen av group by i Mysql är konstig. Normalt sett så måste alla kolumner antingen ingå i group by eller en aggregatfunkion.

Som du har definierat frågan så finns det flera olika t.id att välja mellan och Mysql tar första bästa. Det är inte relaterat till den post där man hittar det minsta värdet.

För att kunna få fram det resultat du vill så måste man använda subselect och det finns inte i Mysql. Det enda alternativet som jag ser är att ställa flera frågor.

Återkommer senare, har möte nu.

246 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)