Avatar billede michaelgm Nybegynder
20. januar 2008 - 21:07 Der er 6 kommentarer og
1 løsning

MIN og MAX giver ingen mening

SELECT
cv.BUS,
MAX(s.kmtaeller) as kmtaeller,
s.smoeretype as kmtjek,
MIN(DATE_FORMAT(s.dato,'%d-%m-%Y')) AS dato,
v.KmStand
FROM
c2.vognlob AS cv
Inner Join vaerksted.vehicle AS v ON cv.BUS = v.vognnr
Left Outer Join vaerksted.smoereliste AS s ON cv.BUS = s.busnr
WHERE
cv.PLANPERIODE =  '19' AND
cv.BUS = '614'
GROUP BY
cv.BUS

Når jeg skal have nyeste dato og højeste kmtaeller burde man da men jeg sku bruge MAX()

for at få den nyeste dato skal jeg skrive:
MIN(DATE_FORMAT(s.dato,'%d-%m-%Y')) AS dato,

Nogen der ved hvad der går galt?
Avatar billede michaelgm Nybegynder
20. januar 2008 - 21:25 #1
Kunne forestille mig det er pga at jeg laver det om til dansk format.
Men er der ikke andre muligheder end at skulle til at explode i php for at få den rigtige dato?
Avatar billede kjulius Novice
20. januar 2008 - 21:34 #2
Jeg vil tro, at det er fordi du formatterer datoen før du laver din MAX gruppering. Det du formatterer til er det danske format, altså dag, måned, år. Dvs. at "30-01-2006" vil blive opfattet som større end "01-12-2007", da der nu er tale om tegnstrenge, som bliver sammenlignet tegn for tegn.

Prøv at ændre det til DATE_FORMAT(MAX(s.dato), '%d-%m-%Y')) AS dato

På den måde vil MAX blive brugt på den oprindelige dato variabel, som kan sorteres korrekt.

For øvrigt får du den nyeste dato med MAX, og ikke MIN som du har brugt i dit eksempel.
Avatar billede michaelgm Nybegynder
21. januar 2008 - 13:12 #3
Ja. det var os det jeg havde på fornemmelsen.
Har selv løst den sådan her:

    SELECT
    cv.BUS,
    s.kmtaeller,
    s.smoeretype as kmtjek,
    DATE_FORMAT(s.dato,'%d-%m-%Y') AS dato,
    v.KmStand
    FROM
    c2.vognlob AS cv
    Inner Join vaerksted.vehicle AS v ON cv.BUS = v.vognnr
    Inner Join vaerksted.smoereliste AS s ON cv.BUS = s.busnr AND s.dato=(SELECT MAX(ss.dato) FROM vaerksted.smoereliste AS ss WHERE ss.busnr=cv.BUS)
    WHERE
    cv.PLANPERIODE =  '19'
    GROUP BY
    cv.BUS
    ORDER BY
    s.dato DESC

Men er sikker på dit eks os virker.
Avatar billede kjulius Novice
21. januar 2008 - 17:22 #4
Ja, du har selvfølgelig ret i, at du kun behøver at sortere på s.dato :-) Jeg tænkte vist mere på, hvordan man kunne bruge den i MAX funktionen i SELECT delen.

Til gengæld kan jeg ikke rigtigt lide, at du har fjernet MAX funktionen i SELECT delen. Den vil så bare vise en tilfældig værdi fra den del at datasættet, hvor BUS feltet er ens.

I det hele taget er jeg ikke glad for den måde MySQL tillader, at man kan gruppere på bare et enkelt felt uden at behøve at sætte MIN, MAX, SUM, AVG og lign. gruppefunktioner på de resterende felter. Det er der ingen andre databaser der (så vidt jeg ved) tillader, og det kan skabe meget tvivl om indholdet af disse felter.

Hvis du vil være sikker på at få det rigtige resultat, bør du (også af hensyn til, at du måske ikke altid skal arbejde med MySQL) gøre det rigtigt:

SELECT
    cv.BUS,
    MAX(s.kmtaeller) as kmtaeller,
    s.smoeretype as kmtjek,
    DATE_FORMAT(MAX(s.dato), '%d-%m-%Y')) AS dato,
    v.KmStand
    FROM
    c2.vognlob AS cv
    Inner Join vaerksted.vehicle AS v ON cv.BUS = v.vognnr
    Inner Join vaerksted.smoereliste AS s ON cv.BUS = s.busnr AND s.dato=(SELECT MAX(ss.dato) FROM vaerksted.smoereliste AS ss WHERE ss.busnr=cv.BUS)
    WHERE
    cv.PLANPERIODE =  '19'
    GROUP BY
    cv.BUS, s.smoeretype, v.kmstand
    ORDER BY
    s.dato DESC

Det kan være du synes det er noget pjat, og at det er meget lettere at gøre det på den måde som MySQL tillader, men der er altså en grund til at alle andre databaser kræver, at man enten opfører felterne på en GROUP BY eller bruger en aggregat funktion (grupperingsfunktion som SUM, MIN, MAX, AVG, STDDEV mv.)
Avatar billede kjulius Novice
21. januar 2008 - 17:25 #5
Hmm... Måske har du omgået problemet med din nye subselect på joinen. Den havde jeg ikke lige lagt mærke til...
Avatar billede michaelgm Nybegynder
24. januar 2008 - 17:05 #6
Det med max på kmtaeller er jo som du selv kom i tanke om løst ved at have nyeste dato. En bus har jo ikke kørt mindre på en nyere dato.
Men tak for hjælpen.

Hvis du er rigtig god til sql har jeg et andet spørgsmål der har lagt åben længe som jeg døjer meget med.
http://www.eksperten.dk/spm/813873
Avatar billede michaelgm Nybegynder
10. februar 2008 - 11:58 #7
Jeg lukker. Hvis du gerne ville have points for dette spørgsmål må du lige skrive.
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