Avatar billede reimers Nybegynder
04. juni 2005 - 14:57 Der er 5 kommentarer og
1 løsning

MySQL problem med GROUP BY og min()

Jeg benytter surftown.dk og ved kun at det drejer sig om MySQL 4.

Jeg ønsker at udvælge IDrecord fra den entry i databasen med ældst dato.

Tabel:

Contenttracking
=======================================
ID IDcontent IDrecord time
---------------------------------------
1    329      17      2005-05-29 13:46:49
2    329      24      2005-05-29 20:33:57
=======================================


Query:

SELECT IDcontent, IDrecord, min( time ) AS time
FROM contenttracking
WHERE IDcontent = 329
GROUP BY IDcontent


Resultat på surftown:

=======================================
IDcontent IDrecord time
---------------------------------------
329      24      2005-05-29 13:46:49
=======================================

Resultat på min egen testserver (MySQL 4.0.23):

=======================================
IDcontent IDrecord time
---------------------------------------
329      17      2005-05-29 13:46:49
=======================================

På surftown vælger den altså den korrekte dato, men GROUP BY vælger IDrecord fra en anden entry. Hvad skal jeg gøre for at den vælger den værdi for IDrecord, der er knyttet til min(time)?

Håber nogen kan hjælpe.

Mvh.

Reimers
Avatar billede erikjacobsen Ekspert
04. juni 2005 - 15:02 #1
Det er, som du selv ser, ganske tilfældigt hvilken der bliver valgt, når du bruger
et felt, der ikke er med i listen angivet ved GROUP BY. Det er også stort set kun
MySql der tillader det - det ville være mere meningsfyldt at give en fejlmeddelelse.

Kommer id-erne i samme rækkefølge som tidspunktet, så kan du skrive:  min(IDRecord)
Ellers skal du i gang med noget andet.
Avatar billede reimers Nybegynder
04. juni 2005 - 16:09 #2
Tak skal du have. Det må siges at være en rigtig upraktisk feature. Jeg kan desværre ikke bruge min(IDrecord), så jeg må udtænke en anden løsning.
Avatar billede erikjacobsen Ekspert
04. juni 2005 - 19:03 #3
Hvilken version af mysql kører surftown med? Måske vi kan finde på noget smart.
Avatar billede hmortensen Nybegynder
05. juni 2005 - 04:38 #4
Kan du ikke blot gøre sådan her:
SELECT `IDcontent`, `IDrecord`, `time`
FROM `contenttracking`
WHERE `IDcontent` = 329
ORDER BY `time`
LIMIT 1
Avatar billede reimers Nybegynder
16. juni 2005 - 16:18 #5
Hmm... virker mail-abonnement ikke altid. Jeg beklager meget, at jeg ikke har set jeres kommentarer.

Jeg kørte en SELECT VERSION() og fik:
4.0.24-standard-log

Mht. hmortensens kommentar:

Problemet er, at tabellen contenttracking registrerer ændringer for flere forskellige IDcontent. Jeg vil gerne lave et join med en anden tabel på netop IDcontent, således at resultatet indeholder de forskellige IDcontent knyttet til den dato, hvor de blev oprettet.

Jeg troede umiddelbart, at det kunne løses ved oprettelse af en TEMPORARY TABLE, men der får jeg samme problem. Jeg tror umiddelbart, at det bliver nødvendigt med en ekstra kolonne til markering af første entry for hver IDcontent.
Avatar billede reimers Nybegynder
21. juni 2005 - 11:27 #6
Eftersom der ikke er nogen løsning til problemet, lukker jeg spørgsmålet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester