my $sth = $dbh->prepare("SELECT id
FROM user
WHERE group == '1'
ORDER BY id DESC
LIMIT 1");
我试图在没有阅读整个表格的情况下获取表格中最后一行的id。
我已经通过以下方式访问:
my $sth = $dbh->prepare("SELECT name,
group
FROM user
WHERE group == '1'
LIMIT $from, $thismany");
$sth->execute();
while(my ($name,$group) = $sth->fetchrow_array()) {
...并设置一个小的分页查询,如你所见。
但是,我试图找出如何检测我何时在最后一行(< = 500)行,这样我就可以关闭我的“下一个500”链接。其他一切都很好。我想出了如何在我自己的前500页上关闭“之前的500”链接!
我以为我会在while循环中设置一个“开关”,所以如果($ id = $ last_id)我可以设置“开关”var。
像:
if ($id = $last_id) {
$lastpage = 1; #the switch
}
所以我可以关闭下一个500链接if($ lastpage == 1)。 我对此非常陌生并且不断陷入这些类型的事情。
感谢您的帮助。
答案 0 :(得分:4)
尝试抓住一个额外的行,看看你真正有多少行。像这样:
my @results = ( );
my $total = 0;
my $sth = $dbh->prepare(qq{
SELECT name, group
FROM user
WHERE group = ?
LIMIT ?, ?
});
$sth->execute(1, $from, $thismany + 1);
while(my ($name, $group) = $sth->fetchrow_array()) {
push(@results, [$name, $group]); # Or something more interesting.
++$total;
}
$sth->finish();
my $has_next = 0;
if($total == $thismany + 1) {
pop(@results);
$has_next = 1;
}
顺便说一句,请在SQL的所有中使用占位符,插值充满了危险。
答案 1 :(得分:3)
总是要求比你要显示的更多一行,因为mu太短,这是一个好方法。
但是如果你想采取其他建议的方法来做两个单独的查询,一个得到所需的行,一个得到总数,如果没有一个限制条款,MySQL提供了一个简单的方法来做到这一点尽可能多地结合工作:
SELECT SQL_CALC_FOUND_ROWS name, group FROM user WHERE group = '1' LIMIT ..., ...;
然后:
SELECT FOUND_ROWS();
SQL_CALC_FOUND_ROWS限定符更改后面的FOUND_ROWS()返回的内容,而不要求您执行完整的SELECT COUNT(*) from user WHERE group = '1'
查询。
答案 2 :(得分:2)
SELECT COUNT(*) from tablename
将为您提供行数,因此如果您保持到目前为止已读取的行数的运行计数,您将知道何时在结果的最后一页上。
您可以使用(未经测试;目前远离一个好的工作站)生成该查询:
my $sth = $dbh->prepare("select COUNT(*) FROM user WHERE group == '1'");
my @data = $sth->fetchrow_array;
my $count = $data->[0];
(PS。你应该知道SQL注入问题 - see here为什么。)
答案 3 :(得分:0)
正如以太在评论中提到的,分页通常需要两个查询。一个用于返回分页集,另一个用于返回记录总数(使用COUNT查询)。
了解记录总数,您当前的偏移量和每页中的记录数量就足以计算出总共有多少页面以及当前页面前后的页数。
答案 4 :(得分:0)
虽然您对SELECT id FROM table WHERE ... ORDER BY id DESC LIMIT 1
的初步建议应该能够找到最高匹配ID,但执行此操作的标准方法是SELECT max(id) FROM table WHERE ...