Avatar billede grafikeren Nybegynder
13. januar 2004 - 19:02 Der er 9 kommentarer og
1 løsning

"SELECT Count" giver for mange resultater.

Hej!

Jeg har en asp kode, som jeg bruger til at udskrive fra en SQL database, når der bliver søgt på et bogstav (f.eks. id=a eller id=b). Den lister altså resultaterne af et search på poster i databasen, som starter med a eller b (id). Problemet er, at den finder flere resultater end der er i databasen! Den skriver simpelthen 2,???? gange flere resultater, end der er i databasen. Dette er jo et problem mht. paging. Der er ca. et par tusind resultater til hvert bogstav...

Den der løser problemet modtager 125 point.


Her er koden:

<%
'Først skal vi have antallet af poster

sql = "SELECT Count(*) As Antal From tblC where left(Ku,1) = '"&request("id")&"' or left(Ku,1) = '"&Ucase(request("id"))&"'"
Set objRs2 = forbind.execute(sql)
response.write objrs2("Antal")
intRecords = int(objRs2("Antal"))
objRs2.Close
Set objRs2 = Nothing

'Variabler til query´et
intPage = Request.QueryString("page")
if intPage = "" OR not isNumeric(intPage) then
    intPage = int(1)
else
    intPage = int(intPage)
end if
intPageSize = int(50)
intStart = intPage*intPageSize
intStart = intStart-intPageSize
intPages = int(intRecords/intPageSize)+1

Set objRs = Forbind.Execute("Select Count(ku) As Antal, ID, ku, al, ge, ov From tblC where left(ku,1) = '"&request("id")&"' or left(ku,1) = '"&Ucase(request("id"))&"' group by ku LIMIT " & intStart & ", " & intPageSize & " ;")

    if objRs.EOF then
        Response.Write ""
    else
           
            Do while not objRs.EOF

        If blnBGColor = True Then
            strBGColor = "#B0C4DE"
            blnBGColor = False
        Else
            strBGColor = "#D9E0EC"
            blnBGColor = True
        End If     


%>
<% if objRs("Antal") <> 1 then%>
<tr bgcolor="<%=strBGColor%>" style="cursor:hand" onMouseOver=TG(this,"#FFFFFF") onMouseout=TG(this,'') onclick="window.location='Liste.asp?ku=<%=objRs("ku")%>&FrontSearch=ku&Searchtext=<%=Soegeord%>'" >
<%else%>
<tr bgcolor="<%=strBGColor%>" style="cursor:hand" onMouseOver=TG(this,"#FFFFFF") onMouseout=TG(this,'') onclick="window.location='visanmeldelse.asp?id=<%=objRs("id")%>&FrontSearch=ku&Searchtext=<%=Soegeord%>'" >
<%end if%>
                      <td class="menu" width="5">&nbsp;  </td>
                      <td class="menu" width="40%"> <b><%=objrs("ku")%></b></td>
<% if objRs("Antal") <> 1 then%>
                      <td class="menu" width="40%"> <b><%=objRs("Antal")%> cd'er</b></td>
<%else%>
                      <td class="menu" width="40%"> <%=objrs("al")%></td>
<%end if%>
<%

if objrs("ge") = "" then
ge = "-"
else
sql2 = "select * from ge where Id = "&objrs("ge")&""
set rs2 = forbind.execute(sql2)

ge = rs2("ge")

set rs2 = Nothing
end if 
%>
<% if objRs("Antal") = 1 then%>
                      <td class="menu" width="15%"> <%=ge%></td>
                      <td class="menu" width="5%"> <% if objrs("ov") <> "" then%><%=objrs("ov")%><%else%>-<%end if%></td>
<%else%>
                      <td class="menu" width="15%"> </td>
                      <td class="menu" width="5%"> </td>
<%end if%>


                    </tr>
<%
objRs.MoveNext
  Loop
    end if
%>
                  </table>
          <table width=100%><tr><td>
<%
'Udskriver en "sideliste"
For i = 1 to intPages
    if intPages = 1 then
    else
    if i = intPage then
        Response.Write "<b>" & i & "</b> "
    else
        Response.Write "<a href=""ku-search.asp?id="&request.querystring("id")&"&page=" & i & """>"
        Response.Write i
        Response.Write "</a> "
    end if
    end if
next
%>
</td>
</tr>
</table>
<%
objRs.Close
Set objRs = Nothing
%>
Avatar billede pfp Nybegynder
13. januar 2004 - 19:06 #1
Hvad er ku? Den bliver ikke initialiseret som en variabel eller noget andet..
Avatar billede Slettet bruger
13. januar 2004 - 19:09 #2
Prøv at ændre din SQL-sætning til "SELECT DISTINCT count....", det var bare et forslag, jeg har ikke læst din kode grundigt igennem da jeg ikke er ASP-glad :-)
Avatar billede pfp Nybegynder
13. januar 2004 - 19:11 #3
Ved brug af DISTINCT så finder den ikke 2 ens poster...
Avatar billede grafikeren Nybegynder
13. januar 2004 - 21:23 #4
Der er ikke nogle ens poster i databasen... Har du en løsning pfp?
Avatar billede nute Nybegynder
13. januar 2004 - 21:58 #5
En 'DISTINCT count' vil ikke gøre noget forskel. en count tæller i alle tilfælde hvor mange poster der er i basen i den gældende kolonne. Hvis man har en kolonne 'test' med 4 poster: "anders", "anders", "and" og "and", så vil en SELECT DISTINCT count( test ) returnere 4.

grafikeren >> Grunden til at du får dobbelt op af dit antal, er nok måske på grund af at du bruger en 'or' operator. Prøv denne SQL istedet ... den bør fikse det for dig

SELECT Count(*) As Antal From tblC where UCase( left(Ku,1) ) = '"& UCase( request("id") ) & "'"

/nute
Avatar billede eagleeye Praktikant
14. januar 2004 - 09:01 #6
Jo hvis man sætter DISTINCT rigtigt, det virker i mySQL og jeg antager det er mysql da der ingår LIMIT i en af de andre SQL sætningerne:

Count(distinct test)
Avatar billede grafikeren Nybegynder
15. januar 2004 - 02:15 #7
Ja, det er SQL. Har ikke haft mulighed for at teste distinct.

Ang. '&' istedet for 'or' -> Jeg modtager ikke kun det dobbelt af det rigtige antal, men jeg modtager jo 2,57843XXXXXX... Det er det underlige!

Jeg tror fokus skal lægges på der hvor antal poster hentes ind. Her må antallet gå fejl og den laver dermed for mange sidetal.

----
'Først skal vi have antallet af poster

sql = "SELECT Count(*) As Antal From tblC where left(Ku,1) = '"&request("id")&"' or left(Ku,1) = '"&Ucase(request("id"))&"'"
Set objRs2 = forbind.execute(sql)
response.write objrs2("Antal")
intRecords = int(objRs2("Antal"))
objRs2.Close
Set objRs2 = Nothing

'Variabler til query´et
intPage = Request.QueryString("page")
if intPage = "" OR not isNumeric(intPage) then
    intPage = int(1)
else
    intPage = int(intPage)
end if
intPageSize = int(50)
intStart = intPage*intPageSize
intStart = intStart-intPageSize
intPages = int(intRecords/intPageSize)+1
---

Er det her i starten, at I vil bruge DISTINCT? Hvis distinct skal sættes ind -> hvad skriver jeg så?
Avatar billede torstenhagemann Nybegynder
16. januar 2004 - 13:18 #8
Prøv med "SELECT Count(DISTINCT left(Ku,1)) ... "
Avatar billede eagleeye Praktikant
16. januar 2004 - 15:12 #9
De fleste databaser tager heller ikke den samme post med flere gange fordi where delen passer flere steder.

Umiddelbart er der ikke noget som skulle drille, men prøv:

sql = "SELECT Count(*) From tblC where left(Ku,1) = '"&request("id")&"' or left(Ku,1) = '"&Ucase(request("id"))&"'"
Set objRs2 = forbind.execute(sql)
response.write objrs2(0)
intRecords = int(objRs2(0))
Avatar billede grafikeren Nybegynder
10. april 2004 - 13:55 #10
Kunne ikke få noget til at virke... Fik bygget et nyt script. Eller tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester