根据行计数在sql中使用limit

6rqinv9w  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(385)

我想获取最大行数为20的倍数的行数,比如如果我的表有148行,那么limit应该是140,留下最新的8项,或者如果我的表有170行,那么limit将是160。在这种情况下,查询将是什么。

$conn = mysqli_connect($server_name, $mysql_username, $mysql_password, 
$db_name);
if($conn === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}

 $number= $_POST['number'];

 $sql1 = "SELECT * FROM abc_table LIMIT WHAT TO ENTER HERE  ";
f0ofjuux

f0ofjuux1#

您可以为此使用变量:

select t.*
from (select t.*, (@rn := @rn + 1) as rn
      from t cross join
           (select @rn := 0) params
      order by ?
     ) t
where rn <= floor(rn / 20) * 20;

这个 ? 表示用于指定顺序的列,大概类似于 id asc .
在mysql 8+中,您将使用窗口函数:

select t.*
from (select t.*,
             row_number() over (order by ?) as seqnum,
             count(*) over () as cnt
      from t
     ) t
where seqnum <= floor(cnt / 20) * 20;
lnvxswe2

lnvxswe22#

据我所知,接下来是什么 LIMIT 必须是整数文本。 LIMIT 甚至不会吃类似的东西 6/2 ,将计算为整数文本。我建议只读取整个表,然后在php中只处理需要的行数。

$row_cnt = $result->num_rows;
$rs_size = $row_cnt - ($row_cnt % 20);

while ($rs_size > 0 && $row = mysqli_fetch_assoc($result)) {
    // process a row
    --$rs_size;
}

以上 while 循环应该在读取20的最大倍数后退出。这种方法并不是太浪费,因为最多只能从mysql中读取19行数据,而这些数据最终不会被使用。

相关问题