Önskar göra ett skript som utifrån databas tar reda på hur du ligger placerad i en "topplista" med flest poster. Låt oss säga att alla medlemmar har ett ID och alla meddelanden på sidan bestäms vem som äger dom utifrån den medlems ID som finns i meddelandetabellens fält "refID". Tjena, köra en ORDER BY på count-svaret? Sen vill jag inte skriva ut en hel lista utan bara skriva ut svaret på den inloggade medlemmen. Antar att det kanske ska se ut något såhär? ska testa... Det låter väl rimligt att göra på det viset, men istället för att skriva do until rs.EOF, som gör att den kör igenom alla poster varje gång så kan du skriva: Tjena, Tack för tipset Sara! Har fått ett problem nu tyvärr. Behöver få in fältet 'status' och 'datum' i sql'n också och lägga till WHERE status = 'unread' AND datum > #2005-01-01 00:00:00# men får en massa felmeddelanden. Hur ska det skrivas? Jakob, Ja det tar jag gärna emot.. det är ju inte så värst stora skillnader. Löser det mitt problem med att lägga WHERE-sats på fler fält? Tjena igen, select userid, namn, (select count(1) from tabell where userid = tabell.userid ) as antal Får fortfarande inte till det med den SQL som du gav mig Pelle. Detta var vad jag försökte göra vilket absolut inte fungerade... försökte plocka ut en count på antalet poster där 'aktiverat' är senare än 2005-05-04 00:00:00 och status = 'aktiverat' samt binda denna count till unika medlemmar med GROUP BY userID och slutligen sortera det och kolla vad den inloggade medlemmen blev rankad som (sessionsID't finns i variabeln 'Vid') Hej,X:e flest poster
det går lätt att köra en "count(*) from messages Where refID = " & memberID & " och få reda på hur många meddelanden en viss medlem har i sin inkorg, men vad jag nu vill få fram är t.ex. "du har 142 meddelanden. du är den medlem med 3:e flest meddelanden på sidan" (eftersom det finns två andra medlemmar som har 167 respektive 873 meddelanden).
Hur kan man smidigt jämföra mot andra counts? sortera counts på något sätt och ta reda på vilket slip-nummer man hamnade på typ?
Tacksam för alla sorters svar
Mvh / JakobSv: X:e flest poster
Enklast är att lägga till ORDER BY och sedan kan du helt enkelt mata ut hela listan sorterad. Lägger du nu till ett löpnummer i en egen kolumn först så har du det hela klart.
// JohanSv:X:e flest poster
Addera = "Select refID, count(*) From messages GROUP BY refID ORDER BY 2 desc"
RS.Open Addera, Conn, 3, 3
nr = 0
Do Until RS.EOF
nr = nr+1
If refID = " & memberID & " Then
Response.Write "Du har " & RS(1) & " meddelanden, " & nr & ":e flest meddelanden bland alla medlemmar"
End If
RS.MoveNext
LoopSv: X:e flest poster
nr = 0
Do Until <b>MemberReached = 1 OR</b> RS.EOF
nr = nr+1
If refID = " & memberID & " Then
Response.Write "Du har " & RS(1) & " meddelanden, " & nr & ":e flest meddelanden bland alla medlemmar"
<b>MemberReached = 1
Else
MemberReached = 0</b>
End If
RS.MoveNext
Loop
På det viset kör den inte genom hela rs:en om man ligger etta.
PS.
En kul idé:
Om medlemmen är etta kan du skriva
Response.Write "Du har " & RS(1) & " meddelanden, du har FLEST meddelanden bland alla medlemmar"
eller om medlemmen är sist (if rs.EOF then)
Response.Write "Du har " & RS(1) & " meddelanden, du har MINST meddelanden bland alla medlemmar"
eller någonting i den stilenSv: X:e flest poster
Jo det var ungefär så jag menade. Grejen är att nu har du en lång lista som du loopar igenom. Nästa steg är att skapa en temptabell med ett idnetity fält där du sedan skickar in din data inklusive user id. Sedan tar du "select bla bla where userid = X" och slutligen droppar du din temp tabell.
På så sätt så sker all körning i databasen, vilket förhoppningsvis är snabbare än din kodloopning.
// JohanSv:X:e flest poster
Johan: temptabell? hajar inte riktigt! Går det att få in fler fält då som jag beskrivit ovan? Kan du ge ett exempel på hur det skulle se ut? Är det istället för det jag och Sara varit inne på eller en komplettering?Sv: X:e flest poster
Jag kan visa ett exempel som funbkar på MS SQL server, men jag kan inte testa på access eftersom jag inte har access installerat. Dock är principen densamma. Så om du vill ha ett exempel som du själv får jobba med at "överstätta" så hojta till.
// JohanSv:X:e flest poster
Sv: X:e flest poster
Det skall inte vara något problem att fixa flera kriterier i din WHERE sats. Jag fixar exempel. Få se hur långt jag orkar ikväll annars kommer det sent imorgon kväll...
// JohanSv: X:e flest poster
from tabell
order by antal desc
Att sedan få en ranking är ganska stökigt med ett anrop eftersom du måste köra igenom frågan på samtliga användare och det är därför tidskrävande. Så som nämns tidigare, skapa antingen en temptabell eller en trigger som lägger upp aktuell status per användare eller liknande för att snabbt bygga ett rankingsustem.Sv:X:e flest poster
Set RS = Server.CreateObject("ADODB.Recordset")
Addera = "Select userID, status, aktiverat, count(*) From varvningar WHERE status = 'aktiverat' AND aktiverat > #2005-05-04 00:00:00# GROUP BY userID ORDER BY 2 desc"
RS.Open Addera, Connect, 3, 3
nr = 0
Do Until MemberReached = 1 OR RS.EOF
nr = nr+1
If clng(RS(0)) = clng(Vid) Then
Response.Write "Du har värvat " & RS(3) & " medlemmar och ligger på plats " & nr & "!"
MemberReached = 1
Else
MemberReached = 0
End If
RS.MoveNext
LoopSv: X:e flest poster
Nu har jag lärt mig en ny sak...att inte ge mig in på saker alldeles för sent på kvällen eftersom jag inte kan sluta...
Nåväl, jag hade på känn att MS Access inte funkar exact lika som MS SQL server så jag var ju tvungen att köra in Access för att kunna ge ett bra exempel... Nedan följer principerna i grova drag med lite exempel, men vad jag inte får till är att kunna stacka flera anrop mot MS access i ett svep så du får nog köra frågorna en och en...
Jag har utgått från följande tabellstruktur:
refID tal
Meddelande Text
status Text
Datum Datum/tid
då kör jag först
<code>
create table temp (
ID counter,
refid integer,
antal integer
);
</code>
för att skapa en tillfällig tabell (det får bli en semitemporär tabell eftersom jag inte hittar exakt hur temp tabeller funkar i access). Sedan så kör vi:
<code>
insert into temp (refid, antal)
Select refID, count(refid) From messages WHERE status = 'unread' and datum > #2005-05-01# GROUP BY refID ORDER BY 2 desc
</code>
för att få in lite data. Här har jag angett dina sökkriterier och eftersom jag har en counter (identity, autonumner, räknare eller vad du vill kalla den) i tabellen så får jag automatiskt ett löpnummer som följer sorteringen på datat jag skickar in. Nu vill jag ha ut data för en specifik användare:
<code>
select * from temp where refid = 67
</code>
och slutligen så måste jag städa bort tabellen jag skapade:
<code>
drop table temp
</code>
Du har lite jobbkvar själv med att kunna exekvera alla anropen och att få in de olika fälten du behöver osv. Men dessa exempel ovan har jag testat och fungerar rakt av.
Lycka till!
// Johan