繁体   English   中英

Perl和MySQL - 使用DBI可能使用last_insert_id从表的最后一行返回一个字段?

[英]Perl and MySQL - Return a field from last row of a table using DBI possibly with last_insert_id?

我试图从最后一行users的表users返回成员firstname字段。

 my $dbh = DBI->connect($dsn, $db_user_name, $db_password) or die "$DBI::errstr";
    my $LastID = $dbh->last_insert_id(`firstname`); ##but I want from table users
    print qq~$LastID~;

从上面返回此错误:

DBI last_insert_id: invalid number of arguments: got handle + 0, expected handle + between 4 and 5
Usage:    $h->last_insert_id($catalog, $schema, $table_name, $field_name [, \%attr ])

那么,从表中users的最后一行获取字段firstname最佳方式是什么(最好是最好的服务器,最快,最少的内存,负载,最少的开销......等等)?

认识到我上面的例子是不被认真对待,因为我不知道如何做到这一点,而不仅仅是做我的粗略,但功能:(ps UserID不是通过自动增量分配,但是,按数字顺序,新用户得到更高的用户ID。就像我解决预先存在的问题时那样。)

my $dbh = DBI->connect($dsn, $db_user_name, $db_password) or die "$DBI::errstr";
my $dsn = $dbh->prepare(qq{SELECT `firstname` FROM `users` ORDER BY ABS(UserID) DESC LIMIT ?,?});
$dsn->execute('1','1') or die "$DBI::errstr";
while(@nrow = $dsn->fetchrow_array()) {
$firstname = $nrow[0];
}

我假设因为我使用DBI可能提供最好的解决方案但是,我显然缺乏经验,需要一些建议和指导来学习正确的方法来做到这一点。 谢谢你的帮助。

你提到UserID没有自动递增,所以我不确定last_insert_id是否可以在这种情况下工作。 可能,但我不确定。 该文件指出:

通常,这是由数据库服务器分配给具有auto_increment或serial类型的列的值。

我想通过使用SQL语句来解决这个问题:

SELECT
    u.firstname
FROM
    users u
JOIN
    (
    SELECT
        MAX(UserID) AS UserID
    FROM
        users
    ) t ON u.UserID = t.UserID

DBI的代码如下所示:

my $stmt = 'SELECT u.firstname FROM users u JOIN(SELECT MAX(UserID) AS UserID FROM users) t ON u.UserID = t.UserID';
my $first_name = ($dbh->selectrow_array($stmt))[0];

last_insert_id方法需要4个参数。 使用这样:

  my $id = $connection->last_insert_id(undef, 'myschemaname', 'mytablename', 'mycolumnname');

请参阅DBI窗格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM