webForumDet fria alternativet

tacksam förhjälp med att förstå kod

ASP

7 svar · 289 visningar · startad av ptr_lks

Medlem sedan juni 2005584 inlägg
Frågan#1

Hej,
hittade nedanstående kod

<%
  strDSN = "FILEDSN=cbwh_chat.dsn"

  Set cn = Server.CreateObject("ADODB.Connection")
  Set rs = Server.CreateObject("ADODB.Recordset")

  cn.Open strDSN

  strSQL = "SELECT * FROM Message WHERE " _
    & "DateDiff('N', Moment, Now) < 30 ORDER BY Moment DESC;"
  rs.Open strSQL, cn

  n = 0
  do while (not rs.EOF) and (n < 20)
    strUser = rs("FromUser")
    strMessage = ""

    if strUser <> "System" then
      strMessage = "<i>" & strUser & "</i>: "
    end if

    strMessage = strMessage & rs("Message") & " <small>(" _
      & FormatDateTime(rs("Moment"), 3) & ")</small>"

    if strUser = "System" then
      strMessage = "<font color=""777777""><b><i>" _
        & strMessage & "</i></b></font>"
    end if

    response.write strMessage & "<br>" &vbCRLF

    n = n + 1 
    rs.MoveNext
  loop 

  rs.Close
  cn.Close

  Set rs = Nothing
  Set cn = Nothing
%>

Lite förklarande text hittade jag också

This means that we will display only messages written in the last T minutes, but not more than M messages. Personally, I consider that a combination like displaying the last 20 messages written in the last 30 minutes could be a right choice in many cases.

litet n i

(n < 20)
n = n + 1

torde betyda antalet mess som jag vill visa
Men vad betyder stort N i

DateDiff('N', Moment, Now)
Medlem sedan dec. 20003 887 inlägg
#2

Litet n i T-SQL-funktionen datediff betyder att differansen ska visas i minuter.

Medlem sedan mars 20032 667 inlägg
#3
(n < 20)
n = n + 1

Ja det är ett villkor för hur många varv loopen har gått. Skulle varit effektivare att selektrera antalet direkt i SQL-frågan. "n" i detta fallet är ett variabelnamn på en kontrollvariabel. Normalt brukar man i första hand använda "i" som variabelnamn för kontrollvariabler i loopar.

Medlem sedan juni 2005584 inlägg
#4

K@llen skrev:

Skulle varit effektivare att selektrera antalet direkt i SQL-frågan. "n" i detta fallet är ett variabelnamn på en kontrollvariabel. Normalt brukar man i första hand använda "i" som variabelnamn för kontrollvariabler i loopar.

hur skulle ditt förslag se ut?

Medlem sedan mars 20032 667 inlägg
#5

Jag skulle använt TOP 20 (Access) och LIMIT 20 (MySQL) för att bara hämta de senaste 20 posterna. Onödigt att hämta en massa data som inte ska användas.

Medlem sedan juni 2005584 inlägg
#6

K@llen skrev:

Jag skulle använt TOP 20 (Access) och LIMIT 20 (MySQL) för att bara hämta de senaste 20 posterna. Onödigt att hämta en massa data som inte ska användas.

Är inte bekant med

TOP 20

, skall googla efter information...

Medlem sedan juni 20003 076 inlägg
#7

www.devguru.com skrev:

The TOP predicate returns the specified number of records from the top of the specified table. The following example returns the first 3 records:

SELECT TOP 3 MusicianName AS Musician, Instrument
FROM Musicians;

http://www.devguru.com/Technologies/jetsql/quickref/select.html

Medlem sedan dec. 20003 887 inlägg
#8

För att få något vettigt med TOP behövs även en ORDER BY, så att det sorteras efter rätt kolumn. Sorteringen sker på första kolumnen default.

Så uttrycket skulle väldå bli

SELECT TOP 20 *
FROM Message
WHERE datediff( 'n', Moment, now ) < 30
ORDER BY Moment DESC

Och med den varianten blir användandet av n i resten av koden överflödigt (om n används till något ytterligare).

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)