sql >> Database teknologi >  >> RDS >> Mysql

Få det samlede antal rækker, når du bruger LIMIT?

Heldigvis siden MySQL 4.0.0 kan du bruge SQL_CALC_FOUND_ROWS mulighed i din forespørgsel, som vil fortælle MySQL at tælle det samlede antal rækker uden hensyntagen til LIMIT klausul. Du skal stadig udføre en anden forespørgsel for at hente rækkeantal, men det er en simpel forespørgsel og ikke så kompleks som din forespørgsel, der hentede dataene. Brugen er ret enkel. I din hovedforespørgsel skal du tilføje SQL_CALC_FOUND_ROWS mulighed lige efter SELECT og i den anden forespørgsel skal du bruge FOUND_ROWS() funktion for at få det samlede antal rækker. Forespørgsler vil se sådan ud:

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

Den eneste begrænsning er, at du skal kalde den anden forespørgsel umiddelbart efter den første, fordi SQL_CALC_FOUND_ROWS gemmer ikke antallet af rækker nogen steder. Selvom denne løsning også kræver to forespørgsler, er den meget hurtigere, da du kun udfører hovedforespørgslen én gang. Du kan læse mere om SQL_CALC_FOUND_ROWS og FOUND_ROWS() i MySQL-dokumenter.

EDIT: Du skal bemærke, at det i de fleste tilfælde faktisk er hurtigere at køre forespørgslen to gange end SQL_CALC_FOUND_ROWS . se her

EDIT 2019:

SQL_CALC_FOUND_ROWS-forespørgselsmodifikatoren og den medfølgende FOUND_ROWS()-funktion er forældet fra og med MySQL 8.0.17 og vil blive fjernet i en fremtidig MySQL-version.

https://dev.mysql.com /doc/refman/8.0/da/information-functions.html#function_found-rows

Det anbefales at bruge COUNT i stedet

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;



  1. Vil du tilføje Auto-Increment ID til eksisterende tabel?

  2. Understøtter Oracle fuldtekstsøgning?

  3. Hvordan definerer man en trigger ON COMMIT i Oracle?

  4. Hvordan vælger man data mellem to datoer fra sqlite db i formatet dd-mm-åååå?