08. april 2008 - 10:31Der er
13 kommentarer og 1 løsning
2 dato felter, sortere efter den nyeste
Jeg har en select hvor jeg trækker en dato ud fra en tabel og en dato ud fra en anden tabel som er relateret til den første tabel. Datoen fra nr 2 tabel kan være null, hvis der ingen rækker er oprettet som knytter sig til tabel 1.
Det jeg ønsker er at lave en sortering i min SQL som sortere efter den nyeste af disse 2 datoer - altså hvis datoen fra tabel 2 er nyere end den fra tabel 1, er det denne dato der skal tælle. Men hvis tabel 2 returnere null, så er det selvfølgelig tabel 1 dato der skal gælde.
Sherlock: Denne vil umiddelbart ikek virke da den kun vil trække de rækker ud hvor der er en tilsvarende række i tbl2? det er ikke altid tilfældet?
Tænk å det som en blog med kommentare. Alle blog indlæg ligger i en tabel og alle kommentare ligger i en anden tabel. Jeg ønsker så t lave et udtræk der viser den seneste aktivitet - dvs ikke bare en dato sortering på hvornår det enkelte blog indlæg er oprettet.
SHerlock: Umiddelbart vil denne vel gøre det samme, da du i din whee caluse siger at de t1.id skal være lig t2.t1id, og så vil den jo ikke returnere dem hvor der ingen rækker findes i t2?
Ahh. der mangler også en from-clause :) Den her giver alle rækker i tbl1 og evt. relaterede rækker i tbl2.
select t1dato, t2dato, if (t1dato > if (isnull(t2dato),t1dato, t2dato)), t1dato, t2dato) as highdate from tbl1 left outer join tbl2 on t2.tbl1id = t1.id order by highdate
Jeg får følgende fejl på ovenstående sætning (selvfølgelig rettet til de korrekte navne):
Msg 156, Level 15, State 1, Line 2 Incorrect syntax near the keyword 'if'. Msg 156, Level 15, State 1, Line 2 Incorrect syntax near the keyword 'if'. Msg 174, Level 15, State 1, Line 2 The isnull function requires 2 argument(s).
:| har kigget på flere MYSQL-ting idag og så ikke, det var MSSQL.
Prøv det her. Jeg kan ikke selv teste det.
select t1dato, t2dato, case when t1dato > isnull(t2dato, t1dato) then t1dato else t2dato end as "highdate" from tbl1 left outer join tbl2 on t2.tbl1id = t1.id order by highdate
Joh, lige ved og næsten. Problemet er nu at alle de indlæg som ingen kommentare har, altså hvor tbl2 returnere NULL, de kommer sidst i sorteringen, og dermed kommer alle med tilhørende kommentare altså øverst.
Nope. Der er 331 rækker. De første 169 rækker kommer "fint" ud, da der her både er data i tbl1 og tbl2, og her virker highdate korrekt, dvs den tager den nyeste af de 2 datoer.
Men alle de rækker i tbl1 som ingen data har i tbl2 kommer fra række 169 til 331. Dvs de kommer til sidst, selv om den nyeste dato af dem alle, faktisk er indeholdt i en af disse.
Derudover, glemte jeg at nævne tidligere, så kan der være flere rækker i tbl2. Dvs vi skal have noget med en TOP 1 ind og ORDER BY t2dato DESC, for at få den nyeste dato i tbl2, eller?
select t1.id, case when max( t1dato) < COALESCE(max(t2dato), max(t1dato)) then max(t2dato) else max(t1dato) end as "highdate" from tbl1 t1 left outer join tbl2 t2 on t2.tbl1id = t1.id group by t1.id
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.