当我在控制台中尝试时,下面的查询工作正常。
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:
有什么想法我可能做错了吗?
答案 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子句的一部分。
也许如果你包含一个样本数据集,它可以帮助我们找到你想要的结果。