Использование Limit в SQL в соответствии с row_count - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу получить количество строк с наибольшим числом, кратным 20. Например, если в моей таблице 148 строк, то предел должен быть 140, оставляя последние 8 записей позади, или если в моей таблице 170 строк, то предел будет 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  ";

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Для этого можно использовать переменные:

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;
0 голосов
/ 25 декабря 2018

Насколько я знаю, то, что следует 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 из доступных.Этот подход не слишком расточителен, поскольку в большинстве случаев вы читали бы из 19 дополнительных строк из MySQL, которые в конечном итоге не использовались бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...