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.
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
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
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.
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
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
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
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
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 :(
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..
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.