webForumDet fria alternativet

Self join (igen)

25 svar · 422 visningar · startad av Vide

VideMedlem sedan dec. 19996 094 inlägg
#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

------------------
Mostly Harmless

LarsGMedlem sedan dec. 200012 465 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

------------------
essentitia preter non sans multiplicandum

VideMedlem sedan dec. 19996 094 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?

------------------
Mostly Harmless

LarsGMedlem sedan dec. 200012 465 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.

------------------
essentitia preter non sans multiplicandum

@ndersMedlem sedan juni 200026 914 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,

------------------
Har du sett Bires lilla häst?

VideMedlem sedan dec. 19996 094 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

------------------
Mostly Harmless

@ndersMedlem sedan juni 200026 914 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,

------------------
Har du sett Bires lilla häst?

VideMedlem sedan dec. 19996 094 inlägg
#8

på ".execute"...

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

------------------
Mostly Harmless

[Redigerat av Vide den 18 dec 2001]

LarsGMedlem sedan dec. 200012 465 inlägg
#9

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

------------------
essentitia preter non sans multiplicandum

spangoMedlem sedan juni 20006 147 inlägg
#10

snafu.

[Redigerat av spango den 18 dec 2001]

VideMedlem sedan dec. 19996 094 inlägg
#11

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

------------------
Mostly Harmless

@ndersMedlem sedan juni 200026 914 inlägg
#12

Med iif-varianten.

------------------
Har du sett Bires lilla häst?

VideMedlem sedan dec. 19996 094 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...

------------------
Mostly Harmless

LarsGMedlem sedan dec. 200012 465 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

------------------
essentitia preter non sans multiplicandum

VideMedlem sedan dec. 19996 094 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

------------------
Mostly Harmless

LarsGMedlem sedan dec. 200012 465 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

------------------
essentitia preter non sans multiplicandum

VideMedlem sedan dec. 19996 094 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...

------------------
Mostly Harmless

VideMedlem sedan dec. 19996 094 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

------------------
Mostly Harmless

LarsGMedlem sedan dec. 200012 465 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

------------------
essentitia preter non sans multiplicandum

VideMedlem sedan dec. 19996 094 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 ;)

------------------
Mostly Harmless

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb