非常奇怪的数据库查询结果

时间:2011-02-21 17:13:05

标签: php mysqli

我的数据库查询得到了一个非常奇怪的结果,我希望有人能发现我错过的东西。

以下是一些示例数据:

feeling_id  country     date            feeling     digit
25          australia   2011-02-21      bad         1
26          australia   2011-02-21      bad         0
8            france      2011-02-21      better      1
我试图计算数据库中每个国家的数量,以及其中有多少数字为1.所以上述数据会给出:

澳大利亚,数字为1 = 1

数据库中的澳大利亚行= 2

数字为1 = 1的法国

数据库中的法国行= 1

这是代码

<?php

include ('mysqli_connect.php'); // indclude mysql connection functions

$countries = array('united states','canada','united kingdom');
$r = array(); 

foreach($countries as $country){
        //e.g. $r_spain holds the results from the query below with spain as $country
        $r[$country] = mysqli_query($dbc,"SELECT * FROM feelings WHERE country = '$country' AND digit='1'");

        //loop through the results
        while($row = mysqli_fetch_array($r[$country], MYSQLI_ASSOC)){
                $rowCount = mysqli_num_rows($r[$country]);

        }       

        //e.g. $r_spain holds the results from the query below with spain as $country
        $r[$country] = mysqli_query($dbc,"SELECT * FROM feelings WHERE country = '$country'");

        //loop through the results
        while($row = mysqli_fetch_array($r[$country], MYSQLI_ASSOC)){
                $rowCount2 = mysqli_num_rows($r[$country]);

        }   

echo $country . '=' . $rowCount . '<br />';
echo $country . '=' . $rowCount2 . '<br />';

}
?>

当数据库中只有两个加拿大行时,我得到以下结果,这些行都没有数字1 ???

美国,数字为1 = 13

数据库中的美国行= 17

加拿大,数字为1 = 13

数据库中的加拿大行= 2

联合王国,数字为1 = 4

数据库中的联合王国行= 4

<小时/> 答案应该说:“数字为1 = 0的加拿大”

加拿大1位答案的数字似乎复制了1个结果的美国数字。

任何人都可以看到我出错的地方吗?

非常感谢,alsweeet

3 个答案:

答案 0 :(得分:4)

为什么在sql上执行count()时循环遍历结果?

SELECT COUNT(feeling_id) FROM feelings WHERE country = '$country' AND digit='1'

答案 1 :(得分:2)

您需要在$rowCount开头设置$rowCount2foreach为0。由于没有找到加拿大的行,因此它永远不会进入while循环,因此会使用上一次迭代中$rowCount$rowCount2的值。

foreach($countries as $country){
    $rowCount = 0;
    $rowCount2 = 0;

答案 2 :(得分:1)

如果没有匹配的行,则$ rowCount和/或$ rowCount根本没有设置。你需要在循环的顶部将它们设置为0。

然而,有一个更好的方法:

select country, digit, count(*) from your_tbl group by country, digit;

这将返回包含3个字段的结果:country,digit和该组合的匹配行数。