SELECT min(t.time) as best_time, t.id, t.driver_id, t.track_id, t.date, d.name as driver_name
FROM gp4_time t, gp4_driver d
WHERE d.id=t.driver_id
AND track_id=1
GROUP BY t.driver_id
ORDER BY best_time
så får jag allt rätt, men t.date blir fel, det blir datumet för en annan post i tabellen gp4_time :l
Tabellen serut såhär,
gp4_time: id, driver_id, track_id, time, date
gp4_driver: id, name, password
Fråga 2,
t.time är en int(11), och det blir det också när jag hämtar den till mitt Java program, men när jag kör SQL satsen ovan så blir best_time en LongLong, varför? Kan man fixa så det också blir en int(11)?
Att du får fel svar beror på en felaktig design i Mysql. Den frågan du har ställt är inte korrekt (alla andra DBMS skulle ge fel). Alla kolumner i select-listan som inte ingår i en aggregatfunktion måste även ingå i group by.
t.ex
A
A B C
-------
1 2 3
1 4 5
select a,max(b),c from A group by A
Du förväntar dig att få
A B C
-------
1 4 5
men du får
A B C
-------
1 4 3
Det som händer är att Mysql tar första bästa värde för C inom varje grupp av A.
För att få det resultat du vill ha så krävs stöd för subselect
select A,b,c from A A1
where b = (select max(b) from A where A = A1.A)
I mysql får man göra det i flera steg med hjälp av en temptabell. Det finnes ett avsnitt i dokumentationen som beskriver detta i detalj.
Att det blir longlong är konstiigt. Hjälper
SELECT cast(min(t.time) as int) as best_time
Att ange int(11) i tabelldefinition är också ett konstigt påhitt i Mysql. 11:an har inget med vilka värden som går att lagra så den är rätt meningslös.
Kan inte prova cast ännu, måste updatera till MySQL 4 först...
The CAST() and CONVERT() functions were added in MySQL 4.0.2
kör med 3.xx fortfarande.
Nu skäms jag lite :) Den första koden som jag postade hjälpte du till med i oktober/november förra året och då hade jag antagligen samma problem eftersom jag i det programmet har tagit bort datum ser jag nu när jag tittar efter :)