webForumDet fria alternativet

Räkna svar

17 svar · 264 visningar · startad av Erik Juhlin

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#1

Jag jobbar lite på ett forum just nu. Jag visar posterna så här:

"SELECT * FROM tblForum WHERE AnswerTo IS NULL ORDER BY PostId DESC"

Men nu vill jag även räkna antalet poster som har AnswerTo = inlägget som visas. Hur skriver man då?

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

LarsGMedlem sedan dec. 200012 464 inlägg
#2

SELECT count(*) as antalSvar FROM tblForum WHERE AnswerTo = 4711

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#3

Jo, det vet jag ju. Men det ska bäddas in i min kod.
AnswerCount ska följa med "SELECT * FROM tblForum WHERE AnswerTo IS NULL ORDER BY PostId DESC" så att jag kan få fram det enkelt för varje tråd sen.

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#4

Jag vill skriva något sånt här. :)

"SELECT *, AnswerCount(SELECT count(*) AS AnswerCount FROM tblForum WHERE AnswerTo = PostId) FROM tblForum WHERE AnswerTo IS NULL ORDER BY PostId DESC"

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#5

Jag löste det så här:

"SELECT *, AnswerCount(SELECT count(*) FROM tblForum WHERE AnswerTo = m.PostId) AS AnswerCount FROM tblForum m WHERE AnswerTo IS NULL ORDER BY PostId DESC"

Nu vet jag inte om den här koden är så korrekt så rätta gärna mig! :)

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#6

Vad är motsatsen till TOP 1?

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#7

Löste det med ORDER BY .. DESC. :)

Nu ser koden ut så här:

"SELECT *, (SELECT count(*) FROM tblForum WHERE AnswerTo = m.PostId) AS AnswerCount, (SELECT MAX(PostDate) FROM tblForum WHERE AnswerTo = m.PostId) AS LatestAnswerDate, (SELECT TOP 1 Name FROM tblForum WHERE AnswerTo = m.PostId ORDER BY PostId DESC) AS LatestAnswerName FROM tblForum m WHERE AnswerTo IS NULL ORDER BY PostId DESC"

Säg gärna till om det är något fel med den. :)

Sen så skulle jag behöva göra så att LatestAnswerDate blir samma som m.PostDate om det inte finns några svar. :)

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Top är bara relevant i samband med sorteringsordning

select top 1 from t order by c asc

post med lägst värde i c

select top 1 from t order by c desc

post med högst värde i c

Om man vill vara portabel (dvs icke micrsoft specifik) så använder man

select min(c)

resp

select max(c)

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#9

Okej, men hur löser man mitt andra problem?

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

LarsGMedlem sedan dec. 200012 464 inlägg
#10
"SELECT *, (SELECT count(*) FROM tblForum WHERE AnswerTo = m.PostId) AS AnswerCount,[b]coalesce((SELECT MAX(PostDate) FROM tblForum WHERE AnswerTo = m.PostId),m.postDate)[/b] AS LatestAnswerDate, (SELECT TOP 1 Name FROM tblForum WHERE AnswerTo = m.PostId ORDER BY PostId DESC) AS LatestAnswerName FROM tblForum m WHERE AnswerTo IS NULL ORDER BY PostId DESC"

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#11

Det funkar inte för mig. :(

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Drivrutin för ODBC Microsoft Access] Odefinierad funktion 'coalesce' i uttryck.
/forum/test.asp, line 8

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

LarsGMedlem sedan dec. 200012 464 inlägg
#12

Jag hade för mig att du använde SQL server ;).

Du kan ju testa så här, osäker om Access stöder det.

"SELECT *, (SELECT count(*) FROM tblForum WHERE AnswerTo = m.PostId) AS AnswerCount,(SELECT iif(MAX(PostDate) is null,m.postdate,max(postdate)) FROM tblForum WHERE AnswerTo = m.PostId) AS LatestAnswerDate, (SELECT TOP 1 Name FROM tblForum WHERE AnswerTo = m.PostId ORDER BY PostId DESC) AS LatestAnswerName FROM tblForum m WHERE AnswerTo IS NULL ORDER BY PostId DESC"

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#13

Jag använder det "på jobbet". Hemma använder jag Access.

Det funkar för mig, men jag kan inte sortera efter det. :l

sql = "SELECT *, (SELECT count(*) FROM tblForum WHERE AnswerTo = m.PostId) AS AnswerCount, (SELECT iif(MAX(PostDate) is null,m.postdate,max(postdate)) FROM tblForum WHERE AnswerTo = m.PostId) AS LatestAnswerDate, (SELECT TOP 1 Name FROM tblForum WHERE AnswerTo = m.PostId ORDER BY PostId DESC) AS LatestAnswerName FROM tblForum m WHERE AnswerTo IS NULL ORDER BY LatestAnswerDate DESC"

Feltyp:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][Drivrutin för ODBC Microsoft Access] För få parametrar angavs. 1 förväntades.
/forum/test.asp, line 8

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

LarsGMedlem sedan dec. 200012 464 inlägg
#14

Du kan skriva, t.ex.


  select * from t order by 5

för att sortera med avseende på det 5:e värdet i select-listan. Det skall egentligen fungera att använda aliaset i order by enligt sql-standarden.

Funktionen iif är specifik för Access.

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#15

Hur menar du att man skulle skriva då?

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

LarsGMedlem sedan dec. 200012 464 inlägg
#16

I stället för att skriva

order by LatestAnswerDate

så använder man det ordningsnummer som LatestAnswerDate har i kolumnlistan och använder det i order by. I och med att du skriver select *, ... så vet jag inte vilket ordningsnummer det blir.

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

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#17

Det funkar, men trådar med 0 svar hamnar längst upp och sorteras separat. :(

Har skrivit så här:

"SELECT *, (SELECT count(*) FROM tblForum WHERE AnswerTo = m.PostId) AS AnswerCount, (SELECT iif(MAX(PostDate) is null,m.postdate,max(postdate)) FROM tblForum WHERE AnswerTo = m.PostId) AS LatestAnswerDate, (SELECT TOP 1 Name FROM tblForum WHERE AnswerTo = m.PostId ORDER BY PostId DESC) AS LatestAnswerName FROM tblForum m WHERE AnswerTo IS NULL ORDER BY 9 DESC"

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#18

Äsch, skrotar det där och slänger in ett extra fält som uppdateras när man svarar på en tråd. Enkelt att sortera efter. :)

------------------
/Erik
www.juhlin.nu /sk8files/ /mp2d/

Söndagen den 3 juni kommer webForum-servern att tas ner för systemunderhåll.
Avbrottet kommer att ske under dagtid. För uppdaterad information se Serverstatus.

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)