簡體   English   中英

Perl MySQL-如何在不遍歷整個表的情況下返回表的最后一行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM