Avatar billede jokkejensen Novice
12. december 2005 - 13:58 Der er 19 kommentarer og
1 løsning

Kun tage højste forekomst

http://www.megaupload.com/dk/?d=DM5ZQZRX
(et billede af databasen, ikke sikkert det bliver aktuelt)

Jeg har en lille database, med noget ordre status på noget larkering til biler..

Jeg ville så gerne lige trække lidt nyttige informationer ud af den, men alle vores udviklere er ikke på job i dag :)


Jeg er kommet frem til noget lignende:

Select ordrer.ordrenr, ordrer.maerke, ordrer.model, ordrer.aargang, ordrer.ordredato, ordrer.id, ordrer.lovetdone, ordreStatuser.status, status.tekst FROM ordrer, OrdreStatuser right join status on ordrestatuser.status = status.id where Ordrer.id = OrdreStatuser.ordre order by id

Men nu er det sådan, at hver gang der er en ny status, ligges bare endnu en række i status tabellen, altså om bilen er modtaget, klargjort, malet etc etc, med mit udtræk for jeg alle statuser ud, men jeg vil kun have den sidste nye - mit udtræk giver ex 6 x ens ordre nummer, hvis bilen har været i gennem alle 6 stadier men jeg ønsker selvfølgeligt kun det sidste nye, det hvor status.id er højst.

Nogen der har et frisk bud ?

På forhånd tak
Jacob Jensen
Avatar billede mr-kill Nybegynder
12. december 2005 - 14:01 #1
kan du ikke bare bruge limit 1?
Avatar billede jokkejensen Novice
12. december 2005 - 14:03 #2
ex:
90046  AUDI, A6 4B 1997 2004 Seda,  08 dec 2005  08:01 12 dec 2005  1 - Ordre Udskrevet 

90046  AUDI, A6 4B 1997 2004 Seda,  08 dec 2005  08:01 12 dec 2005  2 - Ankommet 

90046  AUDI, A6 4B 1997 2004 Seda,  08 dec 2005  08:01 12 dec 2005  3 - Forbearbejdning 

90046  AUDI, A6 4B 1997 2004 Seda,  08 dec 2005  08:01 12 dec 2005  3 - Forbearbejdning 

90046  AUDI, A6 4B 1997 2004 Seda,  08 dec 2005  08:01 12 dec 2005  6 - Færdig 


Her ønsker jeg kun :
90046  AUDI, A6 4B 1997 2004 Seda,  08 dec 2005  08:01 12 dec 2005  6 - Færdig
Avatar billede jokkejensen Novice
12. december 2005 - 14:06 #3
mr-kill > nej TOP vil ikke umiddelbart løse mit problem.. Der er jo flere biler, men jeg ønsker dem kun én gang, og med det højeste status.id
Avatar billede mr-kill Nybegynder
12. december 2005 - 14:06 #4
Kan du bruge dette?

Select ordrer.ordrenr, ordrer.maerke, ordrer.model, ordrer.aargang, ordrer.ordredato, ordrer.id, ordrer.lovetdone, ordreStatuser.status, status.tekst FROM ordrer, OrdreStatuser right join status on ordrestatuser.status = status.id where Ordrer.id = OrdreStatuser.ordre order by id limet 1
Avatar billede mr-kill Nybegynder
12. december 2005 - 14:08 #5
så er det vel bare æøre dem igennem en løkke og smide dem du ikke vil have væk?
Avatar billede jokkejensen Novice
12. december 2005 - 14:14 #6
hehe ja, men det er mange forekomster.. og performance mæssigt er det ikke helt okay..

endvidere er limit kun er til mysql databaser, men jeg er nok med på hvad du mener, men det nytter ikke noget at sortere dem bagefter, jeg vil kun have det korrekte data trukket ud.
Avatar billede arne_v Ekspert
12. december 2005 - 14:21 #7
SELECT MAX(status),ordre,maerke,...  FROM orderer GROUP BY ordre,maerke,...
Avatar billede jokkejensen Novice
12. december 2005 - 14:44 #8
Select ordrer.ordrenr, ordrer.maerke, ordrer.model, ordrer.aargang, ordrer.ordredato, ordrer.id, ordrer.lovetdone, ordreStatuser.status as oStatus, MAX(status.id), status.tekst FROM ordrer, OrdreStatuser right join status on ordrestatuser.status = status.id where Ordrer.id = OrdreStatuser.ordre GROUP BY ordrenr, maerke order by id

Det er nogenlunde korrekt.. den sortere dog forkert i status tabellen...

den tager den første forekomst (Ordre udskrevet, altså status 1) og ikke den højeste forekomst (der til den er nået)


82788  Peugeot, anonym,  18 aug 2005  02:33 22 aug 2005  1 - Ordre Udskrevet 

86260  Peugeot, 206,  07 okt 2005  01:18 11 okt 2005  1 - Ordre Udskrevet
Avatar billede jokkejensen Novice
12. december 2005 - 14:47 #9
(begge biler er længere i forløbet)
Avatar billede arne_v Ekspert
12. december 2005 - 15:18 #10
du skal tage MAX på det felt hvor du vil have den sidste værdi
Avatar billede jokkejensen Novice
12. december 2005 - 16:07 #11
hehe underligt nok..

1000 tak..

smider du et svar :)
Avatar billede jokkejensen Novice
12. december 2005 - 16:16 #12
hmmm det er dog underligt at status.tekst stadig kun skriver "Ordre Udskrevet" selvom status er andet end 1 ?

Altså status er tabellen med de forskellige statuser i, hvorfor henter denne den forkerte ?´altså status 1, selvom den udskriver noget andet..

fletter dem sammen med :
right join status on ordrestatuser.status = status.id

men alligevel bliver status.tekst altid status.id(1) og ikke status.id(X), hvis du er med...

et udpluk :

90064  Volvo, V40,  08 dec 2005  03:00 12 dec 2005  3 - Ordre Udskrevet 

90069  Opel, Corsa B 3dr,  08 dec 2005  10:43 12 dec 2005  6 - Ordre Udskrevet 

90073  MERCEDES-B, E200-E430 W210 1995,  08 dec 2005  11:15 13 dec 2005  3 - Ordre Udskrevet 

90074  MERCEDES-B, E200-E430 W210 1995,  08 dec 2005  11:27 13 dec 2005  3 - Ordre Udskrevet 

90075  Opel, Astra,  08 dec 2005  11:33 10 dec 2005  3 - Ordre Udskrevet 

90077  , ,  08 dec 2005  12:00 16 dec 2005  1 - Ordre Udskrevet

Der skal ikke stå ordre udskrevet ved dem der har 3 og 6.. men kun ved den sidste (90077)..

Sql:

Select ordrer.ordrenr, ordrer.maerke, ordrer.model, ordrer.aargang, ordrer.ordredato, ordrer.id, ordrer.lovetdone, MAX(ordreStatuser.status) as oStatus, status.tekst FROM ordrer, OrdreStatuser right join status on ordrestatuser.status = status.id where Ordrer.id = OrdreStatuser.ordre GROUP BY ordrenr, maerke order by id
Avatar billede arne_v Ekspert
12. december 2005 - 16:17 #13
svar
Avatar billede jokkejensen Novice
12. december 2005 - 16:18 #14
100 mere hvis du løser den anden..
Avatar billede pidgeot Nybegynder
12. december 2005 - 16:19 #15
Et bud:

Select ordrer.ordrenr, ordrer.maerke, ordrer.model, ordrer.aargang, ordrer.ordredato, ordrer.id, ordrer.lovetdone, MAX(ordreStatuser.status) as oStatus, status.tekst FROM ordrer, OrdreStatuser right join status on oStatus = status.id where Ordrer.id = OrdreStatuser.ordre GROUP BY ordrenr, maerke order by id
Avatar billede jokkejensen Novice
12. december 2005 - 16:25 #16
stadig samme :(, det burde da let kunne trækkes ud i en smørre ik ?
Avatar billede jokkejensen Novice
12. december 2005 - 16:36 #17
jeg kan godt se hvad du vil, men når jeg bruger oStatus i min where clause får jeg følgende fejl:

DBISAM Engine Error # 11949: SQL error - Invalid column name 'oStatus' or table correlation name '' specified in WHERE or JOIN clause

Men jeg kan heller ikke bruge Max i min where clause...
Avatar billede pidgeot Nybegynder
12. december 2005 - 16:54 #18
Så et nyt bud, da:

Select ordrer.ordrenr, ordrer.maerke, ordrer.model, ordrer.aargang, ordrer.ordredato, ordrer.id, ordrer.lovetdone, ordreStatuser.status, status.tekst FROM ordrer, OrdreStatuser right join status on ordreStatuser.status = status.id where Ordrer.id = OrdreStatuser.ordre AND ordreStatuser.status=(SELECT MAX(ordreStatuser.status) FROM OrdreStatuser WHERE OrdreStatuser.ordre=Ordrer.id)  GROUP BY ordrenr, maerke order by id

Bemærk at den muligvis er ret ineffektiv!
Avatar billede jokkejensen Novice
12. december 2005 - 16:57 #19
DBISAM Engine Error # 11949: SQL error - Right parentheses expected, instead found 'MAX' in WHERE or JOIN clause ..

Men det er sku ikke noget vi skal bruge unødvendig tid på, så må de sku bare selv lave deres lort :), så henter jeg bare den status.tekst ud efterfølgende :) kræver dog et par DB kald :(
Avatar billede jokkejensen Novice
12. december 2005 - 16:59 #20
Det er ikke det mest avancerede SQL den odbc driver kan klare tror jeg ikke..

Det er en odbc driver fra www.contextsoft.com til en dbisam DB, aner ikke om man kan bruge alt standard SQL..
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