如何从给定的行号开始选择 MySQL 中的行?

Posted

技术标签:

【中文标题】如何从给定的行号开始选择 MySQL 中的行?【英文标题】:How can I select rows in MySQL starting at a given row number? 【发布时间】:2010-11-18 04:04:00 【问题描述】:

假设我在一个 mysql 表中有 50 行。我想选择前十个 (LIMIT 10),然后我希望能够在不同的页面上选择接下来的 10 个。

那么我如何在第 10 行之后开始我的选择?

更新查询:

mysql_query("
    SELECT * FROM `picdb`
    WHERE `username` = '$username'
    ORDER BY `picid` DESC
    LIMIT '$start','$count'
")

【问题讨论】:

试试 mysql_query("SELECT * FROM picdb WHERE username = '$username' ORDER BY picid DESC LIMIT $start,$count") 重新编辑,您应该将错误反馈设置为能够告诉您 SQL 出了什么问题的程度。你会发现你有一个语法错误,因为你的 LIMIT 子句在你的 ORDER BY 子句之前。 【参考方案1】:

我建议使用以下方法获取第一页:

LIMIT 0, 10

然后是第二页

LIMIT 10, 10

然后

LIMIT 20, 10

第三页,以此类推。

【讨论】:

很抱歉问,但我一直想知道这是如何工作的?它对我有用,但我无法得到它,这是否意味着从 21 开始,最多 10 行? 我已经进行了一段时间的搜索,并且起始编号取决于引擎,当我使用 innodb 进行测试时,它以 0 而不是 1 开头,因此您应该检查您的引擎偏好。 @Developer106:实际上,在任何情况下我都无法复制以 1 开头的索引,所以我什至不知道这个答案的先前版本是如何发生的。【参考方案2】:
LIMIT 10

LIMIT 10 OFFSET 10

来自MySQL 5.1 docs on SELECT syntax:

为了与 PostgreSQL 兼容, MySQL 也支持 LIMIT row_count OFFSET 偏移量语法。

【讨论】:

有效吗?我从没见过。 我不确定 OFFSET 的普及程度;但它更清楚一点,因为您不必记住哪个数字是限制,哪个是偏移量。【参考方案3】:

这个问题很老,但我只想添加一个未硬编码的代码,混乱给出的答案意味着您必须对脚本进行硬编码(选择语句)。您可以通过获取文件名然后根据当前页面从数据库中选择数据来获得相同的结果,而无需对您的选择语句进行硬编码。 先获取当前页面

$page = basename($_SERVER['SCRIPT_FILENAME']);
$page_counter = rtrim($page, ".php");
//setting your limit
$start = 0;
$limit = 10;
//if current page is not index.php then $start = ($limit * page_counter); 
// e.g if current page is 1.php then $start = ($limit * 1) = 10
//if current page is 2.php then $start = ($limit * 2) = 20
if ($page !== 'index.php') 

 $start = ($limit * $page_counter);

//getting row count
$ROW_COUNT = $db->query('SELECT * from tableName')->rowCount();

//getting number of rows left in the table
$rows_left = ("SELECT * FROM tableName limit ?,?");
$rows_left = $db->prepare($rows_left);
$rows_left->execute(array($start,$ROW_COUNT));
$rows = $rows_left->fetchAll(PDO::FETCH_ASSOC);

$number_rows = 0;
foreach ($rows as $r) 
 $number_rows = $number_rows + 1;
 
 //if number of rows left in the table is less than 10 then $limit = the number of rows left
 if ($number_rows < 10) 
 $limit = $number_rows;
 

 //getting all rows
            $getRows = "SELECT * FROM tableName limit ?,?";
            $getRows = $db->prepare($getRows);
            $getRows->execute(array($start , $limit));
            $getRows = $getRows->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

【参考方案4】:
select * from 'table_name' 
ORDER BY 'column_id 'DESC 
LIMIT 0,10;

select * from 'table_name' 
ORDER BY 'column_id' DESC 
LIMIT 10,10;

select * from 'table_name' 
ORDER BY 'column_id' DESC
LIMIT 20,10;

然后继续直到你想要的数字。

【讨论】:

欢迎来到***!这是一个非常古老的高流量问题,您的答案是否添加了其他已经确定的答案没有添加的内容?一般来说,如果您可以编辑现有的、已接受的答案以反映任何必要的更改而不是一个全新的答案,那会更好,因为大多数用户不会向下滚动到底部(您的答案将出现的位置)答案将是。

以上是关于如何从给定的行号开始选择 MySQL 中的行?的主要内容,如果未能解决你的问题,请参考以下文章

在给定行号的文本文件中打印行

如何选择字符串的一个字符作为单独的行 MySQL

如何在 MYSQL 中选择包含所有字母和数字的行?

Mysql:从一个表中选择不在另一个表中的行

如何使用 C++ 中的流从文件末尾读取给定数量的行?

如何从python中的字符索引中找到行号?