2015-11-22 9 views
0

当我在控制台中尝试时,下面的查询正常工作。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: 

任何想法,我可能做错了什么?

回答

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子句的一部分。

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

+0

我放弃了,并将其分为两个不同的查询。 – gatorreina

相关问题