J'ai plus de 500 lignes avec dans ma table de base de données avec une date particulière.
Pour interroger les lignes avec une date particulière.
select * from msgtable where cdate='18/07/2012'
Cela retourne 500 lignes.
Comment interroger ces 500 lignes de 10 lignes étape par étape. Interroger les 10 premières lignes et afficher dans le navigateur, puis interroger les 10 lignes suivantes et afficher dans le navigateur?
Utilisez simplement la clause LIMIT
.
SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10
Et à partir du prochain appel, vous pouvez le faire de la manière suivante:
SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10 OFFSET 10
Plus d'informations sur OFFSET
et LIMIT
sur LIMIT
ET OFFSET
.
LIMIT limit OFFSET offset
fonctionnera.
Mais vous avez besoin d'une clause stable ORDER BY
, sinon les valeurs peuvent être ordonnées différemment pour le prochain appel (après toute écriture sur la table, par exemple).
SELECT *
FROM msgtable
WHERE cdate = '2012-07-18'
ORDER BY msgtable_id -- or whatever is stable
LIMIT 10
OFFSET 50; -- to skip to page 6
Utilisez un style de date conforme aux normes ( ISO 8601 dans mon exemple ), qui fonctionne indépendamment de vos paramètres régionaux.
La pagination changera quand même si les lignes concernées sont insérées, supprimées ou modifiées dans les colonnes appropriées. Il doit.
Pour éviter ce décalage ou obtenir de meilleures performances avec les grandes tables, utilisez des stratégies de pagination plus intelligentes:
SET @rownum = 0;
SELECT sub.*, sub.rank as Rank
FROM
(
SELECT *, (@rownum := @rownum + 1) as rank
FROM msgtable
WHERE cdate = '18/07/2012'
) sub
WHERE rank BETWEEN ((@PageNum - 1) * @PageSize + 1)
AND (@PageNum * @PageSize)
Chaque fois que vous passez les paramètres @PageNum
et le @PageSize
pour obtenir la page spécifique que vous souhaitez. Par exemple, les 10 premières lignes seraient @PageNum = 1 and @PageSize = 10
pour les 10 premiers rangs ...
SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 0,10
pour les 10 prochaines lignes
SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 10,10
<html>
<head>
<title>Pagination</title>
</head>
<body>
<?php
$conn = mysqli_connect('localhost','root','','northwind');
$data_per_page = 10;
$select = "SELECT * FROM `customers`";
$select_run = mysqli_query($conn, $select);
$records = mysqli_num_rows($select_run);
// while ($result = mysqli_fetch_array($select_run)) {
// echo $result['CompanyName'] . '<br>';
// }
// $records;
echo "<br>";
$no_of_page = ceil($records / $data_per_page);
if(!isset($_GET['page'])){
$page = 1;
}else{
$page = $_GET['page'];
}
$page_limit_data = ($page - 1) * 10;
$select = "SELECT * FROM customers LIMIT " . $page_limit_data . ',' . $data_per_page ;
$select_run = mysqli_query($conn, $select);
while ($row_select = mysqli_fetch_array($select_run)){
echo $row_select['CompanyName'] . '<br>' ;
}
for($page=1; $page<= $no_of_page; $page++){
echo "<a href='pagination.php?page=$page'> $page" . ', ';
}
?>
<br>
<h1> Testing Limit Functions Here </h1>
<?php
$limit = "SELECT CompanyName From customers LIMIT 10 OFFSET 5";
$limit_run = mysqli_query($conn , $limit);
while($limit_result = mysqli_fetch_array($limit_run)){
echo $limit_result['CompanyName'] . '<br>';
}
?>
</body>
</html>
D'accord. Je pense donc que vous devez simplement mettre en œuvre la pagination.
$perPage = 10;
$pageNo = $_GET['page'];
Trouvez maintenant le nombre total de lignes dans la base de données.
$totalRows = Get By applying sql query;
$pages = ceil($totalRows/$perPage);
$offset = ($pageNo - 1) * $perPage + 1
$sql = "SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT ".$offset." ,".$perPage
Vous pouvez utiliser postgresql Cursors
BEGIN;
DECLARE C CURSOR FOR where * FROM msgtable where cdate='18/07/2012';
Puis utiliser
FETCH 10 FROM C;
chercher 10 lignes.
Finnois avec
COMMIT;
pour fermer le curseur.
Mais si vous devez faire une requête dans différents processus, LIMIT et OFFSET comme suggéré par @Praveen Kumar est préférable