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
SELECT count(*) as antalSvar FROM tblForum WHERE AnswerTo = 4711
------------------
essentitia preter non sans multiplicandum
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.
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.
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.
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.
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 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
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 "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
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 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
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 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
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 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
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.
Ä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.