web-dev-qa-db-fra.com

Sélectionner tous les enregistrements à l'aide des requêtes MySQL LIMIT et OFFSET

Je cherche un moyen d'accomplir:

SELECT * FROM table

mais en utilisant LIMIT et OFFSET comme ceci:

SELECT * FROM table LIMIT all OFFSET 0

Existe-t-il un moyen d'écrire une instruction SQL en utilisant LIMIT et OFFSET tout en obtenant TOUT le résultat?
(Bien sûr, je peux utiliser une instruction IF mais je l’évite plutôt si possible) 

Toute aide serait appréciée!

23
Lior Elrom

Depuis la documentation MySQL :

Pour récupérer toutes les lignes d'un certain décalage jusqu'à la fin du résultat définir, vous pouvez utiliser un grand nombre pour le deuxième paramètre. Ce instruction récupère toutes les lignes de la 96ème à la dernière:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

Donc, obtenir toutes les lignes peut ressembler à ceci:

SELECT * FROM tbl LIMIT 0,18446744073709551615;
30
sroes

J'ai utilisé ce code dans nodeJS avec MySQL et il fonctionne bien, il peut vous aider ... Pourquoi vous l'utilisez? 

  1. C'est fiable car c'est une chaîne qui va être ajoutée à une requête.
  2. Si vous souhaitez définir une limite, vous pouvez définir la limite avec la variable, sinon passez 0 avec la variable. 

    var noOfGroupShow=0;  //0: all, rest according to number   
    if (noOfGroupShow == 0) {
        noOfGroupShow = '';
    } 
    else {
        noOfGroupShow = ' LIMIT 0, '+noOfGroupShow;
    }
    var sqlGetUser = "SELECT `user_name`,`first_name`,`last_name`,`image`,`latitude`, `longitude`,`phone`,`gender`,`country`,`status_message`,`dob` as user_date_of_birth FROM `tb_user` WHERE `user_id`=?"+noOfGroupShow;
    
2
Pritam Jana

Au fur et à mesure que l'enregistrement grandira, utilisez mysql_num_rows pour rechercher dynamiquement le nombre total d'enregistrements, au lieu d'utiliser some large number.

$cektotalrec=mysql_query("SELECT * FROM TABLE");
$numoffset=mysql_num_rows($cektotalrec); 
$numlimit="0";

puis:

$final="SELECT * FROM table ".$numlimit.", ".$numoffset"";
2
Farid Rudiansyah

Ce n’est peut-être pas la meilleure façon de le faire, mais c’est la première qui me vient à l’esprit ...

SELECT * FROM myTable LIMIT 0,1000000

Remplacez 1000000 par un nombre suffisamment grand qui, à votre connaissance, sera toujours supérieur au nombre total d'enregistrements dans le tableau.

2
Nate S.

Peut-être pas la solution la plus propre, mais fixer une limite à un nombre très élevé pourrait fonctionner. Le décalage doit être 0.

Pourquoi ne pas utiliser une instruction IF dans laquelle vous ajoutez la limite et le décalage à la requête, car une instruction est vraie?

1
AgeDeO
  1. Vous pourriez recevoir une erreur si vous définissez la limite sur un nombre très élevé, comme défini par mysql doc. De ce fait, vous devriez essayer de le limiter à 9999999999999, monter plus haut peut vous donner une erreur, sauf si vous configurez le serveur pour aller plus haut.

  2. Vous voudrez peut-être utiliser LIMIT dans une fonction, ce n'est donc pas une mauvaise idée. Si vous l'utilisez dans une fonction, vous voudrez peut-être que Limit All (Limiter tout) soit à un moment donné et limit à 1 à un autre point. 

  3. Ci-dessous, je liste un exemple où vous voudrez peut-être que votre application n'ait pas de limite. 

function get_navigation ($ select = "*", $ from = "pages", $ visible = 1, $ subject_id = 2, $ order_by = "position", $ sort_by = "asc", $ offset = 0, $ limite = 9551615 ) { connexion globale $;

$query = " SELECT {$select} ";
$query .= " FROM {$from}  ";

$query .= " WHERE visible = {$visible} ";
$query .= " AND subject_id = {$subject_id} ";

$query .= " ORDER BY {$order_by}  {$sort_by} ";
$query .= " LIMIT {$offset}, {$limit} ";

mysqli_query($connection, $query);
$navigation_set = mysqli_query($connection, $query);
confirm_query($navigation_set);
return $navigation_set;


}

define ("SELECT", "*");
define ("FROM", "pages");
define ("VISIBLE", 1);
define ("SUBJECT_ID", 3);
define ("ORDER_BY", "position");
define ("SORT_BY", "ASC");
define ("LIMIT", "0");


$navigation_set = get_navigation(SELECT, FROM, VISIBLE, SUBJECT_ID, ORDER_BY, SORT_BY); 
0
Lesly Revenge