Avatar billede nythjem Nybegynder
24. februar 2010 - 23:10 Der er 5 kommentarer og
1 løsning

Find alle records i forespørgsel (mySql + limit + FOUND_ROWS)?

Kære alle,

Jeg har en lettere bøvlet problemstilling, som jeg har forsøgt at løse i en del tid nu..

Jeg skal lave en slags paginering - og begrænser derfor udtrækket med LIMIT og viser de næste rækker med offset (eller LIMIT 10, 0)

Problemet er nu, at jeg gerne vil vide hvor mange rækker der i virkeligheden findes indenfor forespørgslen.

Sql = "SELECT city_name, city_dist AS distance FROM cities HAVING distance < 30 ORDER BY distance LIMIT 10 OFFSET 0"

Jeg har set i mySql´s dokumentation, at der findes en funktion der hedder FOUND_ROWS().

Er der nogen meget kloge hoveder, der kan give et eksempel på brugen af det med understående kode?

På forhånd tak tak tak!

SQLserveradr    = "..."
SQLdatabase        = "..."
SQLlogin        = "..."
SQLpassword        = "..."

'-- Create connection
Set Conn = Server.CreateObject("ADODB.Connection")
conStr = "driver={MySql};server=" & SQLserveradr & ";database=" & SQLdatabase & ";uid=" & SQLlogin & ";pwd=" & SQLpassword & ";"
Conn.Open conStr

Sql = "SELECT city_name, city_dist AS distance FROM cities HAVING distance < 30 ORDER BY distance LIMIT 10 OFFSET 0"

Set Record =  Conn.Execute(Sql)

If Record.EOF Then
   
        '-- Found nothing
        Response.Write("<pre>No records found..</pre>")
   
    Else

        Do While Not Record.EOF
       
            ....
       
        Record.MoveNext
        Loop
       
    End If

'-- Clean object
Record.Close
Set Record = Nothing

'-- Close connection
Conn.Close
Set Conn = Nothing
Avatar billede showsource Seniormester
25. februar 2010 - 01:22 #1
Nu kender jeg ikke lige FOUND_ROWS(), men

SELECT COUNT(*) FROM cities WHERE distance < 30

skulle gerne gi' dig det samlede antal rows
Avatar billede showsource Seniormester
25. februar 2010 - 02:07 #2
Nåh, læste lidt i docs,

Sql = "SELECT SQL_CALC_FOUND_ROWS city_name, city_dist AS distance FROM cities HAVING distance < 30 ORDER BY distance LIMIT 10 OFFSET 0"

rowsialt = "SELECT FOUND_ROWS()"

Du afvikler første sql, og med den næste får du antal af rows ialt
Avatar billede nythjem Nybegynder
25. februar 2010 - 11:19 #3
Hej Steffen,

Tak fordi du gider :)

Jeg har naturligvis været inde ovre count, men grundet min LIMIT, så kan den ikke bruges :)

Jeg kan simpelthen ikke få det til at fungere - måske er jeg helt hen i vejret mht. syntaks. Kan du eventuelt give et kraftigt vink med en vognstang?

Forsøg 1:

'-- Execute
Sql = "SELECT SQL_CALC_FOUND_ROWS city_name, city_dist AS distance FROM cities HAVING distance < 30 ORDER BY distance LIMIT 10 OFFSET 0"
Set Record =  Conn.Execute(Sql)
rowsialt = "SELECT FOUND_ROWS()"

Udskriver jo bare "SELECT FOUND_ROWS()".


Forsøg 2:

'-- Execute
Sql = "SELECT SQL_CALC_FOUND_ROWS city_name, city_dist AS distance FROM cities HAVING distance < 30 ORDER BY distance LIMIT 10 OFFSET 0"
Set Record =  Conn.Execute(Sql)
Set rowsialt = Conn.Execute("SELECT FOUND_ROWS()")

Giver en fejl på variabel navnet
Avatar billede showsource Seniormester
25. februar 2010 - 15:39 #4
Øhh, nu er jeg til php.

Og flg. virker fint for mig:

$sql = "SELECT SQL_CALC_FOUND_ROWS varenavn, varepris FROM  tabel  ORDER BY varenavn ASC LIMIT 3";
$sqlrows = mysql_query($sql) or die (mysql_error());

echo mysql_num_rows($sqlrows);

$sqltotal = "SELECT FOUND_ROWS()";
$rowstotal = mysql_query($sqltotal) or die (mysql_error());

echo"<p>Rows i tabel: ".mysql_result($rowstotal,0);

Men du burde jo kunne lave en COUNT() som det første, UDEN brug af LIMIT, og på den måde få samlet antal rows.
Avatar billede nythjem Nybegynder
27. februar 2010 - 04:39 #5
Hej Steffen,

Tusinde tak for dine svar.. Jeg er en spadser til at gætte "ny" syntaks - jeg fandt dog ud af det på din foranledning..

Du må meget gerne lægge et svar - og tak for tiden / hjælpen!

Løsning:

Sql = "SELECT city_name, city_dist AS distance FROM cities HAVING distance < 30 ORDER BY distance LIMIT 10 OFFSET 0"

Set Record =  Conn.Execute(Sql)

If Record.EOF Then
   
        '-- Found nothing
        Response.Write("<pre>No records found..</pre>")
   
    Else

        Do While Not Record.EOF
       
            ....
       
        Record.MoveNext
        Loop
       
    End If

'-- Clean object
Record.Close
Set Record = Nothing

'-- Get all objects within query without limit
Set AllFound = Conn.Execute("SELECT FOUND_ROWS()")

    Response.Write("<pre>All found -> " & AllFound(0) & "</pre>")

'-- Close all
AllFound.Close
Set AllFound = Nothing

'-- Close connection
Conn.Close
Set Conn = Nothing
Avatar billede showsource Seniormester
27. februar 2010 - 09:30 #6
Godt du fandt ud af det :O)
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

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



IT-JOB