Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当跟踪语句返回1时,为什么perl DBI返回0行_Mysql_Perl_Dbi - Fatal编程技术网

Mysql 当跟踪语句返回1时,为什么perl DBI返回0行

Mysql 当跟踪语句返回1时,为什么perl DBI返回0行,mysql,perl,dbi,Mysql,Perl,Dbi,本周我第一次使用perl DBI 大多数查询/插入都可以正常工作,但是我遇到了一个返回0行的特定查询的问题。当我为perl DBI启用跟踪,并通过HeidiSQL将完全相同的语句从跟踪复制到服务器时,返回1行 原始SQL查询中是否存在一些歧义?目的是检索具有最新时间戳的行。时间戳列中没有重复项 数据库连接的初始设置: $dsn = 'dbi:mysql:<servername>:<port>'; $dbh = DBI->connect($dsn, "<user

本周我第一次使用perl DBI

大多数查询/插入都可以正常工作,但是我遇到了一个返回0行的特定查询的问题。当我为perl DBI启用跟踪,并通过HeidiSQL将完全相同的语句从跟踪复制到服务器时,返回1行

原始SQL查询中是否存在一些歧义?目的是检索具有最新时间戳的行。时间戳列中没有重复项

数据库连接的初始设置:

$dsn = 'dbi:mysql:<servername>:<port>';
$dbh = DBI->connect($dsn, "<username>","<password>") or die "unable to connect    $DBI::errstr\n";
准备和执行语句: 代码到达打印“未找到行”

my $sth = $dbh->prepare("SELECT name, location, timestamp, notified FROM storage
  WHERE name = ? AND location = ? 
  AND timestamp = (SELECT MAX(timestamp) FROM storage)");

$sth->execute($strg_data->{name}, $strg_data->{location});

my @latest = $sth->fetchrow_array();

if (@latest) {
   <snipped>
}
else {
  print "no rows found!\n";
}
从设置为2的perl DBI跟踪级别中提取:

 -> prepare for DBD::mysql::db (DBI::db=HASH(0xebe4c0)~0xec0010 'SELECT name, location, timestamp, notified FROM storage
WHERE name = ? AND location= ? AND timestamp = (SELECT MAX(timestamp) FROM storage)')
Setting mysql_use_result to 0
<- prepare= DBI::st=HASH(0xecd7d0) at monitor.pl line 147
-> execute for DBD::mysql::st (DBI::st=HASH(0xecd7d0)~0xec9e50 'xxxx' '/tmp/')
-> dbd_st_execute for 00ecd7a0
  -> mysql_st_interal_execute
  Binding parameters: SELECT name, location, timestamp, notified FROM storage
WHERE name = 'xxxx' AND location= '/tmp/' AND timestamp = (SELECT MAX(timestamp) FROM storage)
  <- mysql_st_internal_execute returning rows 0
<- dbd_st_execute returning imp_sth->row_num 0
<- execute= '0E0' at monitor.pl line 152
从存储器中选择MAXtimestamp查找最大时间戳,而不考虑名称和位置。如果指定的名称和位置没有具有该时间戳的记录,则将得到0行

您可能希望改为使用此查询:

SELECT name, location, timestamp, notified FROM storage
  WHERE name = ? AND location = ? 
  ORDER BY timestamp desc LIMIT 1

现在工作正常,修改为将WHERE子句添加到嵌套的SELECT MAXtimestamp。我不清楚为什么我会从另一个SQL客户机得到一个返回行-如果perl DBI和HeidiSQL的结果在这种情况下不匹配?是的,ORDER BY version是合适的,并且可能比嵌套查询更好-确实更容易阅读。@user1792772,可能在查询之间更改了表。是的,没错。刚刚意识到脚本中的下一步是插入到同一个表中,这意味着在运行手动查询时,数据已经更改,并且有一个额外的行具有更新的时间戳和匹配的名称+位置。感谢您的帮助看起来您应该使用$dbh->last\u insert\u id