[英]Perl and MySQL - Return a field from last row of a table using DBI possibly with last_insert_id?
[英]Perl MySQL - How do I return a tables last row id without looping through whole table?
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)我可以設置“開關”變量。
喜歡:
if ($id = $last_id) {
$lastpage = 1; #the switch
}
因此,如果($ lastpage == 1),我可以關閉下一個500個鏈接。 我真的很陌生,並一直堅持這些類型的事情。
感謝您的協助。
嘗試多排一行,看看您真正得到了多少行。 像這樣:
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中使用占位符,插值充滿危險。
如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'
查詢中執行整個單獨的SELECT COUNT(*) from user WHERE group = '1'
。
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注入問題- 請參閱此處了解原因。)
正如評論中以太所提到的,分頁通常需要兩個查詢。 一個返回您的分頁集,另一個返回記錄總數(使用COUNT查詢)。
知道記錄總數,當前偏移量和每頁中的記錄數,就足以計算出總共有多少頁以及當前頁面之前和之后的多少。
盡管您最初對SELECT id FROM table WHERE ... ORDER BY id DESC LIMIT 1
建議是應該使用SELECT id FROM table WHERE ... ORDER BY id DESC LIMIT 1
來查找最高的匹配ID,但這樣做的標准方法是SELECT max(id) FROM table WHERE ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.