Avatar billede lacosanostra Nybegynder
08. april 2008 - 10:31 Der 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.

Nogle der har nogle tips i den retning?
Avatar billede sherlock Nybegynder
08. april 2008 - 10:55 #1
eksempel (ikke testet)

tbl1  =  id, t1dato
tbl2  =  id, tbl1id, t2dato


select t1dato, t2dato, if (t1dato > t2dato, t1dato, t2dato) as highdate
where t1.id = t2.tbl1id
order by highdate
Avatar billede lacosanostra Nybegynder
08. april 2008 - 11:06 #2
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.
Avatar billede sherlock Nybegynder
08. april 2008 - 11:18 #3
Jeg har ikke en mysql her, så det er måske noget vås? :)

select t1dato, t2dato,
  if (t1dato > if (isnull(t2dato),t1dato, t2dato)), t1dato, t2dato) as highdate
where t1.id = t2.tbl1id
order by highdate
Avatar billede lacosanostra Nybegynder
08. april 2008 - 11:24 #4
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?
Avatar billede sherlock Nybegynder
08. april 2008 - 12:03 #5
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
Avatar billede lacosanostra Nybegynder
08. april 2008 - 13:27 #6
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).
Avatar billede sherlock Nybegynder
08. april 2008 - 14:28 #7
:| 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
Avatar billede lacosanostra Nybegynder
08. april 2008 - 15:15 #8
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.
Avatar billede sherlock Nybegynder
08. april 2008 - 15:52 #9
Er det ikke fordi kommentarerne er nyere end indlæggene?
Avatar billede lacosanostra Nybegynder
08. april 2008 - 16:06 #10
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?
Avatar billede sherlock Nybegynder
08. april 2008 - 20:10 #11
Den er underlig, men den virker (vist) :)

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
Avatar billede sherlock Nybegynder
08. april 2008 - 20:12 #12
order by highdate desc, t1.id

:)
Avatar billede lacosanostra Nybegynder
08. april 2008 - 22:18 #13
Yes! Det virkede kanon - takker :-)

COALESCE havde jeg godt nok ikke hørt om før.

Smid et svar.
Avatar billede sherlock Nybegynder
08. april 2008 - 22:38 #14
:)
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