webForumDet fria alternativet
Logga in / Bli medlem

Self join (igen)

Databaser & SQL

25 svar · 422 visningar · startad av Vide

Medlem sedan dec. 19998 577 inlägg
Frågan#1

Tjenare!

/me och joinar är hopplösa... ;)

Har ett forum där jag skall lista inläggen efter de som har senaste svar (och utan svar), men jag får inte till själva joinen.

posts:
Id
HostId (0 om inlägget själv är 'host')
DateTime

Kan någon lära mig en gång för alla... :e

Medlem sedan dec. 200012 464 inlägg
#2
select f.*,coalesce((select max(datetime) from forum where hostid = f.id),datetime) as maxdate
 from forum as f
 where hostid = 0
 order by maxdate desc
Medlem sedan dec. 19998 577 inlägg
#3

Hmm... skulle kanske nämnt att jag tyvärr använder Access.

Får att felmeddelande när jag exekverar den, men inget SQL-fel, utan ett ASP-fel.

Vad gör coalesce?

Medlem sedan dec. 200012 464 inlägg
#4

coalesce(a,b) <==> case when a is null then b end <==> iif(a is null,b,a)

Du kanske kan byta ut coalesce mot iif men jag är tveksam om Access tillåter select inuti en iif. Sen så kommer Access att skrika om

order by maxdate

du får göra

order by 4

dvs den 4:e kolumnen i select-listan.

Men som sagt, så tror jag inte på denna lösning i Access,. Jag funderar lite.

Medlem sedan juni 200032 967 inlägg
#5

Du har inte i asp-koden skrivit exakt som LarsG skrev? ;)

Skämt åsido, vad får du för asp-fel då?

Mvh,

Medlem sedan dec. 19998 577 inlägg
#6

LarsG, oki... Så iif funkar i Access? Trevligt... :)

@nders, hehe... nä så borta är jag inte... :e

Felet är det mycket spännande: Unspecified error

Medlem sedan juni 200032 967 inlägg
#7

På vilken rad? på .open eller på execute?

Hur ser koden ut?

I övrigt så tror jag att LarsGs iif-variant bör fungera.

Mvh,

Medlem sedan dec. 19998 577 inlägg
#8

på ".execute"...

Inte mycket på den raden... ;)
Set m_objRS = m_objConn.Execute(m_strSQL)

Medlem sedan dec. 200012 464 inlägg
#9

Det låter inte så upplyftande. Kan du köra sql-satsen direkt i Access?

Medlem sedan juni 20008 205 inlägg
#10

snafu.

[Redigerat av spango den 18 dec 2001]

Medlem sedan dec. 19998 577 inlägg
#11

LarsG, nej... den säger: "undefined function 'coalesce' in expression"

Medlem sedan juni 200032 967 inlägg
#12

Med iif-varianten.

Medlem sedan dec. 19998 577 inlägg
#13

iif:

select f.*,iif((select max([datetime]) from posts where hostid = f.id),[datetime]) as [maxdate] from posts as f where hostid = 0 order by [maxdate] desc

I ASP säger den:
No value given for one or more required parameters.

När jag kör den i Access så frågar den först efter ett parametervärde för maxdate, och när man inte anger något, så funkar det fint...

Medlem sedan dec. 200012 464 inlägg
#14

Du får byta ut

order by maxdate

mot

order by n

där n är ordningstalet för maxdate i select-listan

Medlem sedan dec. 19998 577 inlägg
#15

Okej, nu visar den iaf posterna, men det visar fler än vad som finns (med hostid = 0), och inte i rätt ordning.

select f.Id, f.subject, f.userid, f.datetime, iif((select max([datetime]) from posts where hostid = f.id),[datetime]) as maxdate from posts as f where hostid = 0 order by 5 desc
Medlem sedan dec. 200012 464 inlägg
#16

Att den visar för många poster förstår jag inte varför.

Ordningen däremot

select f.Id, f.subject, f.userid, f.datetime, iif((select max([datetime]) from posts where hostid = f.id) is null,[datetime],(select max([datetime]) from posts where hostid = f.id)) as maxdate from posts as f where hostid = 0 order by 5 desc
Medlem sedan dec. 19998 577 inlägg
#17

Argh...

Att den hämtade flera poster var bara ett slarvfel, dock är ordningen fortfarande lite konstig, skall kolla lite närmare på hur den sorterar nu och se om jag hittar något...

Medlem sedan dec. 19998 577 inlägg
#18

Nä ni, hittar inget... men det måste ligga i iif-satsen. Det verkar som om den sorterar efter "f.datetime", men den har jag ju inte angivit som order by fält... :q

Medlem sedan dec. 200012 464 inlägg
#19
select f.Id, f.subject, f.userid, f.datetime, iif((select max([datetime]) from posts where hostid = f.id) is null,[b]f.[/b]datetime,(select max([datetime]) from posts where hostid = f.id)) as maxdate from posts as f where hostid = 0 order by 5 desc
Medlem sedan dec. 19998 577 inlägg
#20

Nope... samma som förut...

Såhär ser det ut nu:

select f.Id, f.subject, f.userid, f.datetime, f.forumid = 1, iif((select max([datetime]) from posts where hostid = f.id and f.forumid = 1) is null,f.datetime,(select max([datetime]) from posts where hostid = f.id and f.forumid = 1)) as maxdate from posts as f where hostid = 0 and f.forumid = 1 order by 6 desc

Detta borde ju inte vara ett så ovanligt problem att man vill sortera efter senaste inlägget, varför är det så svårt för... :q ;)

269 ms totalt · 4 externa anrop · v20260731065814-full.05830320
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)