Avatar billede lsskaarup Nybegynder
21. maj 2010 - 14:25 Der er 4 kommentarer og
1 løsning

Finde record med seneste revision

Jeg har en tabel indeholder bl.a. id, tilbud (nr) og rev (revision)

Hvordan får jeg lavet en select der henter alle ud records men seneste revision ud?

Hvis jeg bare group by tilbud og max (rev) er jeg jo ikke sikker på at få det rigtige id.

Mit helt store problem, er at jeg skal have omformet nedenstående query, så den er dynamisk alt efter om brugeren vil se alle revisoiner af et tilbud eller kun den seneste revision.

SELECT
t.tilbud,
t.rev,
t1.tilbudsnummer,
t1.r2,
UNIX_TIMESTAMP(t5.r526d) AS r526d,
UNIX_TIMESTAMP(t5.r526b) AS r526b,
t1.r9,
t1.r18,
t5.r504,
t.status,
k.navn1,
t1.r14,
t1.r1,
t5.r504,
t5.r526a,
t5.r526c,
(TO_DAYS(t5.r526d)-TO_DAYS(NOW())) AS datemark,
t.ordre AS ordrenr
FROM
tilbud AS t,
tilbud0 AS t1
LEFT JOIN
kunde AS k
ON
t1.r14=k.id
LEFT JOIN
tilbud5 AS t5
ON
t1.tilbudsnummer=t5.tilbudsnummer
WHERE
t1.tilbudsnummer=t.id
&&    
(t5.r526a='1')
$search
ORDER BY
$sort,
t.id ASC
Avatar billede RexReptiles Nybegynder
25. maj 2010 - 12:59 #1
sådan umiddelbart kan du vel bare sortere efter et felt som gør netop det, så updater du bare det felt de steder på din side hvor det skulle ønskes.
Avatar billede lsskaarup Nybegynder
25. maj 2010 - 13:34 #2
Det forstår jeg ikke helt...

Jeg prøver lige at simplificere det.

En tabel har følgende felter
ID - primær nøgle
tilbud - tilbudsnummeret
rev - revisionsnummer

Bliver der lavet en ny revision af tilbuddet, bliver der oprettet en ny record, hvor rev er 1 nummer højere end max(rev) for tilbuddet.

Det vil sige der ikke findes et felt, der entydigt siger om tilbuddet har en nyere revision.

Mit problem, er at jeg ikke lige kan gennemskue hvordan jeg får returneret kun den seneste revision af hvert tilbud. Jeg har roddet med noget inner join, men har ikke fundet løsningen, men det kan også være det ikke kan lade sig gøre via inner join.
Avatar billede RexReptiles Nybegynder
25. maj 2010 - 16:04 #3
det lyder som en dum måde.
kan du ik hellere lave et felt der hedder date og så sortere ud fra det.

SELECT * FROM tabel WHERE rev = '$rev' ORDER BY date DESC

så har du datoen til at sortere hvad er nyest.

det tal + 1 er rimlig ledt at sortere i - skal det så være højere eller lavere end hvor meget osv.. og konflikter det med de andre.. langt nemmere med dato.
Avatar billede lsskaarup Nybegynder
25. maj 2010 - 16:11 #4
Det vil jo stadig kræve at jeg efterfølgende lavede en ny query, til at fjerne de "gamle" tilbud...

Men tror jeg selv har fundet en løsning nu:

Jeg finder den højeste revision for hvert tilbud, og joiner så dette med selvsamme tabel, hvor krævet så bare er at tilbudsnumrene skal være ens og revisionerne skal være ens.

select tilbud.* from tilbud inner join (SELECT tilbud.tilbud, Max(rev) AS maxrev
FROM tilbud
GROUP BY tilbud.tilbud) as tmp on tilbud.tilbud = tmp.tilbud and tilbud.rev = tmp.maxrev

Det ser ud til at virke
Avatar billede lsskaarup Nybegynder
25. maj 2010 - 16:23 #5
Så skal jeg abre have det flettet ind i den oprindelige query
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