当用perl DBI包装时,MySQL查询似乎给出了不同的结果

时间:2015-11-22 02:47:00

标签: mysql perl dbi

当我在控制台中尝试时,下面的查询工作正常。

mysql> SELECT COUNT(l.ID), a.MAX_PER_PRD, a.PLURAL, d.TIME_DENOM FROM logro l, challenge c, lib_accomp_type a, lib_deporte d WHERE l.PERIOD=3 AND l.GAME_ID=2 AND l.PLR_ID=3 AND l.ACC_TYPE_ID=11 AND a.sport=d.ID AND c.ACC_TYPE_ID=a.ID AND l.ACC_TYPE_ID=c.ACC_TYPE_ID;

+-------------+-------------+--------------------+------------+
| COUNT(l.ID) | MAX_PER_PRD | PLURAL             | TIME_DENOM |
+-------------+-------------+--------------------+------------+
|           0 |           3 | general commodities| quarter    |
+-------------+-------------+--------------------+------------+
1 row in set (0.01 sec)

但是,当我将它包装在perl-> DBI语句句柄中并使用$ sth-> fetchrow_array获取它时,第二个值是未定义的。

my $q = "SELECT COUNT(l.ID), a.MAX_PER_PRD, a.PLURAL, d.TIME_DENOM
            FROM logro l, challenge c, lib_accomp_type a, lib_deporte d
            WHERE l.PERIOD=?
            AND l.GAME_ID=?
            AND l.PLR_ID=?
            AND l.ACC_TYPE_ID=? 
            AND a.sport=d.ID
            AND c.ACC_TYPE_ID=a.ID
            AND l.ACC_TYPE_ID=c.ACC_TYPE_ID";

     my $sth = $dbh->prepare($q);
     $sth->execute(3, 2, 3, 11);
     my ($CNT, $MAX, $ANAMEP, $TD) = $sth->fetchrow_array; 

     print "COUNT: ", $CNT;
     print "MAX: ", $MAX;

$ perl test_sql2.pl 
Use of uninitialized value $MAX in print at test_sql2.pl line 29.
COUNT: 0MAX:

有什么想法我可能做错了吗?

1 个答案:

答案 0 :(得分:2)

根据你的mysql客户端/库版本,mysql以不同的方式处理这种情况。

对于mysql< = 5.6,请参阅Group By Handling

对于mysql = 5.7,请参阅Group By Handling

您的查询的计数为0,但是其他列的值已返回。这似乎没有任何意义。似乎通过perl运行实际上是在做逻辑事情,而mysql只是用任意值填充MAX_PER_PRD,PLURAL,TIME_DENOM列。

这里的主要问题是,您引用非聚合列而不将它们作为group by子句的一部分。

也许如果你包含一个样本数据集,它可以帮助我们找到你想要的结果。