20. januar 2008 - 21:07Der 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,
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
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?
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.
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
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.)
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
Jeg lukker. Hvis du gerne ville have points for dette spørgsmål må du lige skrive.
Synes godt om
Ny brugerNybegynder
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.