1

我有一张看起来像的桌子

 ID |value
 --------
 1  |  10
 --------
 2  |  30
 --------
 3  |  20
 --------
 4  |  20
 --------
 5  | 10 
 --------

我按降序排序并使用 LIMIT 选择前两行。

所以选择查询返回:

 --------
 2  |  30
 --------
 3  |  20
 --------

现在我想以相同的排序方式选择后两行,所以结果应该是:

 --------
 4  |  20
 --------
 1  |  10
 --------

我怎样才能做到这一点 ?

查询必须是动态查询 ,我的意思是在选择这两行之后,我应该选择接下来的两行,依此类推,直到表格结束。

重要声明

查询必须从上一个选择中获取最后一个 ID,并自动生成接下来的两个。抱歉,我在第一次发布问题时忘记说。

4

3 回答 3

2

利用LIMIT 2, 2

在此处阅读有关 LIMIT 的更多信息:http: //php.about.com/od/mysqlcommands/g/Limit_sql.htm

于 2012-10-22T20:02:51.037 回答
2

您可以使用子句的OFFSET部分:LIMIT

LIMIT 2 OFFSET 2;

这将允许您限制在指定偏移量之后开始的结果,在这种情况下 - 在第二行之后。

更新(动态查询?)
要使选择/偏移动态,您需要在 PHP 中处理该部分。我假设你正在拉记录,用它们做点什么,然后拉下一组?如果这是正确的,你可以只保留一个计数器来记录你已经完成了多少次迭代:

$offsetCounter = 0;
// start your loop, based on whatever you need (for, while, etc.)
    $limit = 'LIMIT 2 OFFSET ' . (2 * $offsetCounter++);
    // append `$limit` to the end of your query
    $query = 'SELECT ID, value FROM yourTable ORDER BY value DESC ' . $limit;

UPDATE #2(动态查询,没有OFFSET
如果你不能使用OFFSET,或者至少一个计数器来实现它,但是你可以使用检索到的最后一条记录的 ID,你可以将它添加到你的WHERE子句中(我也建议排序在这种情况下也通过 ID 字段)。

像下面这样的东西应该可以工作(如有必要,更新以使用准备好的语句):

$lastIdSelected = 0;
// start your loop
    $query = 'SELECT ID, value FROM yourTable';
    $query .= (($lastIdSelected != 0) ? ' WHERE id > ' . $lastIdSelected : '');
    $query .= ' ORDER BY value DESC, id ASC LIMIT 2';
    // execute query, do your work, etc.

    // on your last record, do:
    $lastIdSelected = $row['ID'];

当然,这也遵循我第一次使用OFFSET变量更新的格式。您可以将其修改为使用临时变量来存储最后一个 ID,但无论哪种方式,它最终的工作量都可能相同。

于 2012-10-22T20:03:10.860 回答
1

您可以使用偏移量

$sql = 'SELECT ID, value FROM myTable LIMIT 0, 2 ORDER BY value DESC;

以上将为您提供前两行。

$sql = 'SELECT ID, value FROM myTable LIMIT 2, 2 ORDER BY value DESC;

这将为您提供接下来的两行

更多关于 LIMIT 的信息可以在这里找到

于 2012-10-22T20:06:14.210 回答