Sitter och funderar på hur jag ska göra för att plocka ut lite statistik ur databasen (access)
Har en antal tabeller för exvis medlemmar, inlägg, kommentarer till inläggen osv osv.
Hur går jag tillväga om jag vill plocka ut vilket användar ID som har gjort flest av de inlägg som finns i inläggsdatabasen, och dessutom räkna hur många dessa inlägg är? Och dessutom skriva ut namnet på personen istället för ID't.
Krångligt?
Andra exempel är att ta fram hur många inlägg som finns totalt i inläggstabellen.
I inläggstabellen finns ett fält som räknar hur många gånger ett inlägg visats. Hur tar jag fram vilket inlägg som visats flest gånger?
Vilket inlägg som har flest kommentarer?
Problemet ligger i att jag inte riktigt förstår hur man gör när man först vill räkna ur tabellen och dessutom göra det efter diverse kriterier.
Någon som kan hjälpa mig lite?
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg Ungefär så här (med påhittade kolumnnamn och kopplingar).
sql-stas för att få fram vilka som gjort flest inlägg
select count(*),username
from medlemmar inner join inlagg
on medlemmar.id = inlagg.medlemsid
group by username
order by 1 desc
Totala antalet inlägg
select count(*) from inlagg where svarTill = 0
inlägg med flest kommentarer
select count(*) as antal,id from inlagg
where svartill <> 0
group by id
order by 1 desc
Jag behöver mer utförlig beskrivning av tabellerna.
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 01 feb 2002]
oh tack.
vet inte riktigt vilken info du vill ha om tabellerna men här är lite grann:
medlemstabellen k_members har ID och name (och en del andra som jag antar är ointressanta?)
inläggstabellen k_messages har ID (på inlägget), name (på den som skrev det), date, content, title och hits
kommentarstabellen, k_comments har commentID, messID, comment_name (den som skrev kommentaren), comment_date, comment_content
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg flest inlägg blir enklare då man inte behöver någon join för att få tag på namnet
select name,count(*)
from k_messages
group by name
order by 2 desc
Om du bara vill ha en post så kan du lägga till top 1
Antal inlägg blir också enkel
select count(*) as antal from k_messages
Mest visningar
select top 1 hits, title from k_messages order by hits desc
Inlägg med flest kommentarer
select top 1 title, count(*)
from k_messages inner join k_comments on k_messages.id = k_comments.messid
group by title
order by 2 desc
------------------
essentitia preter non sans multiplicandum
så bra!
ursäkta min dumhet men hur applicerar jag detta sedan då? För att få den att skriva ut korrekt sak och så vidare :r
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg Okej, ett exempel. Du får anpassa öppnngen av databasen så att det passar.
dim connect,rs
set connect = server.createobject("adodb.connection")
connect.open "dsn"
set rs = connect.execute(_
"select top 1 name,count(*) " & _
" from k_messages " & _
" group by name " & _
" order by 2 desc"
if not rs.eof then
response.write rs(0) & " har gjort flest inlägg (" & rs(1) & " stycken)"
end if
rs.close
set rs = nothing
connect.close
set connect = nothing
------------------
essentitia preter non sans multiplicandum
Tjusigt! det fungerar alldeles jättefint.
En fråga till, när jag tar fram vilket inlägg som har flest kommentarer så skrivs ju titeln och antalet kommentarer ut.
Hur ska det se om jag även vill ha med vem som skrev inlägget?
(i utskriften ungefär "inläggsnamn av Laidback (12 kommentarer)")
Jag löste det i de andra exemplen men just detta gick jag bet på :)
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg select top 1 title,name,count(*)
from k_messages inner join k_comments on k_messages.id = k_comments.messid
group by title,name
order by 2 desc
------------------
essentitia preter non sans multiplicandum
hmm.. nu blev det genast ett helt annat inlägg som hade flest kommentarer. :OO och det antalet stämde inte alls?
med några mindre justeringar av din ursprungskod så ser det nu ut så här
<%
set RecSet = Databas.execute(_
"select top 1 title,name,count(*) " & _
"from k_messages inner join k_comments on k_messages.id = k_comments.messid " & _
"group by title,name " & _
"order by 2 desc")
if not RecSet.eof then
response.write RecSet(0) & " av " & RecSet(1) & " som har " & RecSet(2) & " kommentarer"
end if
RecSet.close
set RecSet = nothing
%>
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg tadam..
<%
set RecSet = Databas.execute(_
"select top 1 title,name,count(*) " & _
"from k_messages inner join k_comments on k_messages.id = k_comments.messid " & _
"group by title,name " & _
"order by [b]3[/b] desc")
if not RecSet.eof then
response.write RecSet(0) & " av " & RecSet(1) & " som har " & RecSet(2) & " kommentarer"
end if
RecSet.close
set RecSet = nothing
%>
Jo, när man skriver order by 2 så innebär det att man sorterar enligt andra kolumnen i select-listan. I och med att jag lade till kolumnen namn så blev sorteringen på fel kolumn (name).
Det är sorteringsordningen som styr vilka poster som top väljer.
------------------
essentitia preter non sans multiplicandum
tjoho. så tjusigt! tänk vad man lär sig :)
Om jag ska våga vara riktigt jobbig så frågar jag hur jag gör för att länka till sidan för inläggets id :r
Sidan heter view_message.asp och anledningen till att detta kan vara prakiskt är att det inte finns någon spärr för att en användare kan döpa sina inlägg till samma sak.
Det blir då (i mitt testfall) svårt att avgöra vilket inlägg som avses. :)
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg <%
set RecSet = Databas.execute(_
"select top 1 title,name,id,count(*) as antal " & _
"from k_messages inner join k_comments on k_messages.id = k_comments.messid " & _
"group by title,name,id " & _
"order by 4 desc")
if not RecSet.eof then
response.write "<href='view_message.asp?id=" & recset("id") & "'>" & RecSet("title") & "</a> av " & RecSet("name") & " som har " & RecSet("antal") & " kommentarer"
end if
RecSet.close
set RecSet = nothing
%>
Jag bytte så att man använder namn i stället för nummer i recset, det underlättar om man lägger till fler fält. Jag lade också till as antal i select-satsen så att man kan namnge det värdet också. Tyvärr så tillåter inte Access att man använder det namnet i order by, där går det bara att använda nummer.
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 01 feb 2002]
mystiken tätnar :)
återigen så blir ett annat inlägg det mest kommenterade. och, det blir ingen länk what so ever?..
jag kanske skulle slutat fråga för en stund sen :l
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg Jag förstår varför det inte blir någon länk
response.write "<a href='view_message.asp?id=" & recset("id") & "'>" & RecSet("title") & "</a> av " & RecSet("name") & " som har " & RecSet("antal") & " kommentarer"
Att det blir fel post förstår jag inte.
------------------
essentitia preter non sans multiplicandum
som du sa, länken fungerar nu, men den sorterar fortfarande galet. skumt värre.
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg Kan du visa koden?
Du kan ju även ta bort top 1 och köra select-satsen direkt i Access och se vad du får ut.
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 01 feb 2002]
okej, nu ser koden ut så här
<%
set RecSet = Databas.execute(_
"select top 1 title,name,ID,count(*) as antal " & _
"from k_messages inner join k_comments on k_messages.ID = k_comments.messid " & _
"group by title,name,ID " & _
"order by 4 desc")
if not RecSet.eof then
response.write "<a href='view_message.asp?messID=" & recset("ID") & "'>" & RecSet("title") & "</a> av " & RecSet("name") & " som har " & RecSet("antal") & " kommentarer"
end if
RecSet.close
set RecSet = nothing
%>
tar jag bort top 1 får jag samma inlägg fortfarande?
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg Nej, jag tycker att selecten ser rätt ut.
Om du gör så här då
<%
set RecSet = Databas.execute(_
"select top 1 title,name,ID,(select count(*) from k_comments where messid = km.id ) as antal " & _
"from k_messages km " & _
"order by 4 desc")
if not RecSet.eof then
response.write "<a href='view_message.asp?messID=" & recset("ID") & "'>" & RecSet("title") & "</a> av " & RecSet("name") & " som har " & RecSet("antal") & " kommentarer"
end if
RecSet.close
set RecSet = nothing
%>
------------------
essentitia preter non sans multiplicandum
då plockar den en som har 0 kommentarer? om jag ändrar sort by 4 desc till asc så händer nada.
------------------
I wish I had your cocaine-confidence...
LarsGMedlem sedan dec. 200012 464 inlägg Jag förstår varför det blir fel i den sista varianten, om det inte finns någon kommentar så blir resultatet av count null och de sorteras alltid först
Ett sista försök innan jag går och lägger mig
<%
set RecSet = Databas.execute(_
"select top 1 title,name,ID,(select count(*) from k_comments where messid = km.id ) as antal " & _
"from k_messages km " & _
"where exists ( select 1 from k_comments " & _
"where messid = km.id )" & _
"order by 4 desc")
if not RecSet.eof then
response.write "<a href='view_message.asp?messID=" & recset("ID") & "'>" & RecSet("title") & "</a> av " & RecSet("name") & " som har " & RecSet("antal") & " kommentarer"
end if
RecSet.close
set RecSet = nothing
%>
Får se vad morgondagen har i sitt sköte.
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 02 feb 2002]