0

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

 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 ])

firstname那么,从表的最后一行获取字段的“最佳”方式是什么(最适合服务器、最快、最少的内存、负载、最少的开销……无论如何)users

意识到我上面的例子不应该被认真对待,因为我不知道如何做到这一点,而不仅仅是做一些像我的粗略但功能性的事情:(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 可能会提供最佳解决方案,但是我显然缺乏经验,需要一些建议和指导来学习正确的方法来做到这一点。感谢您的任何帮助。

4

2 回答 2

2

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

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

我希望通过使用 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];
于 2012-05-16T15:28:49.137 回答
0

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

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

请参阅 DBI 吊舱。

于 2012-05-16T14:31:50.777 回答