webForumDet fria alternativet

Fel datum och fel datatyp

Databaser & SQL

5 svar · 274 visningar · startad av Viktor

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

2 frågor har jag.

Först,

När jag kör denna fråga

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

/Viktor

Medlem sedan dec. 200012 464 inlägg
#2

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.

Medlem sedan aug. 20021 752 inlägg
#3

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 :)

/Viktor

Medlem sedan maj 2001431 inlägg
#4

I 4.1 kan du även använda sub-selects :)

Medlem sedan aug. 20021 752 inlägg
#5

Ok, en följdfråga.
Kan jag på något sätt få den den bästa av alla tider i resultatet i en egen kolumn som finns med alla resultat?

Typ,

|id|name  |bestTime|super_best_time|
---------------------------------------
|1 |Kalle |125     |125            |
|2 |Anka  |153     |125            |
|3 |Dalle |175     |125            |

Hoppas ni förstår vad jag menar :) Annars är det bara att fråga igen :)

/Viktor

Medlem sedan dec. 200012 464 inlägg
#6

Den kolumnen kan du väl lägga till i ditt java program. (Nej, det går inte direkt i SQL-frågan utan skalära subselect.)

407 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
271 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
271 ms — ändringar (db)