Executando verificação de segurança...
5

MySQL — Função de paginação FOUND_ROWS descontinuada

Em 2017 escrevi o artigo MySQL — Paginação otimizada onde eu falava sobre o query modifier SQL_CALC_FOUND_ROWS e a função FOUND_ROWS() que permitia simplificar paginações.

Basicamente, você poderia fazer um select SQL_CALC_FOUND_ROWS * from table limit 15 para obter 15 registros e armazenar a quantidade de registros que essa consulta retornaria se não tivesse o LIMIT(), e depois fazer um select FOUND_ROWS() para obter o número total de registros que foi armazenado.

select SQL_CALC_FOUND_ROWS * from table limit 15;
select FOUND_ROWS();

Em 2018 (sim, faz tempo), com o lançamento do MySQL 8.0, essa duplinha foi marcada como deprecated, com a intenção de ser removida em uma versão futura.

A justificativa para a descontinuação é de que este método de paginação seria lento, que consultas com UNION teriam problemas e que é possível obter o mesmo resultado realizando dois selects — um com o limit e outro com count() sem limit — como você pode conferir neste link https://dev.mysql.com/worklog/task/?id=12615

select * from table limit 15;
select COUNT(*) from table;

A versão 9 do MySQL foi anunciada e na sua documentação ainda consta essa duplinha lá como deprecated, ou seja, ainda não foi removida — provavelmente não quiseram quebrar a retro compatibilidade.

Então por enquanto você ainda pode manter no seu código essa dupla e atualizar para a versão mais recente que não terá problema — pelo menos não por isso. Mas caso esteja começando um projeto agora e for implementar uma busca com paginação, recomendo que não utilize o modificador e a função, para evitar retrabalho futuro.

Espero que esse conteúdo possa te ajudar!
Até a próxima!

Carregando publicação patrocinada...
1
1

Claro! Abaixo temos o mesmo exemplo usando PDO nas duas formas.
Para este exemplo, usei uma tabela users com 7 registros.

Utilizando SQL_CALC_FOUND_ROWS + FOUND_ROWS()

<?php

$statement = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from users where status = :status limit :limit offset :offset');
$statement->bindValue(':status', 'ACTIVE', PDO::PARAM_STR);
$statement->bindValue(':limit', 3, PDO::PARAM_INT);
$statement->bindValue(':offset', 0, PDO::PARAM_INT);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
print_r($result);

$statement = $pdo->prepare('select FOUND_ROWS()');
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
print_r($result);

---

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => user_a
            [status] => ACTIVE
        )

    [1] => Array
        (
            [id] => 2
            [name] => user_b
            [status] => ACTIVE
        )

    [2] => Array
        (
            [id] => 3
            [name] => user_c
            [status] => ACTIVE
        )

)
Array
(
    [FOUND_ROWS()] => 7
)

Utilizando COUNT(*)

<?php

$statement = $pdo->prepare('select * from users where status = :status limit :limit offset :offset');
$statement->bindValue(':status', 'ACTIVE', PDO::PARAM_STR);
$statement->bindValue(':limit', 3, PDO::PARAM_INT);
$statement->bindValue(':offset', 0, PDO::PARAM_INT);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
print_r($result);

$statement = $pdo->prepare('select count(*) from users where status = :status');
$statement->execute(['status' => 'ACTIVE']);
$result = $statement->fetch(PDO::FETCH_ASSOC);
print_r($result);

---

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => user_a
            [status] => ACTIVE
        )

    [1] => Array
        (
            [id] => 2
            [name] => user_b
            [status] => ACTIVE
        )

    [2] => Array
        (
            [id] => 3
            [name] => user_c
            [status] => ACTIVE
        )

)
Array
(
    [count(*)] => 7
)