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?
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
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.
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
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?
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