web-dev-qa-db-fra.com

Comment interroger les 10 premières lignes et la prochaine fois interroger les 10 autres lignes de la table

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?

17
Ramprasad

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:

10
Erwin Brandstetter
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

2
Mahmoud Gamal

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
1
Ankit Kumar
<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>
1
Raj

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
0
user5271805

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

0
AlbertFerras