PHP计算在许多列中包含相同值的MYSQL行

Posted

技术标签:

【中文标题】PHP计算在许多列中包含相同值的MYSQL行【英文标题】:PHP counting MYSQL rows that contain the same value in many columns 【发布时间】:2016-05-01 22:20:33 【问题描述】:

这是我的表格的内容:

如何计算不同表格单元格中的所有名称以获得这样的结果?

鲍勃-7 Alex-3 伊万-5 尼娜-5 .........

使用此代码:

<?php
$q= mysqli_query($db, 'SELECT * FROM names');
    while ($all = mysqli_fetch_array($q)) 
        $k1= $all['Name1'];
        $k2= $all['Name2'];
        $k3= $all['Name3'];
        $k4= $all['Name4'];
        $k5= $all['Name5'];
        $k6= $all['Name6'];
        $arr[]= $k1;
        $total_values = array_count_values($arr);
    
    foreach ($total_values as $key => $value) 
        echo $key .'-'. $value .'<br>';
    

我的输出结果是:

鲍勃-3 亚历克斯-1 伊万-1 尼娜-2

当我将代码更改为:

<?php
$q= mysqli_query($db, 'SELECT * FROM names');
    while ($all = mysqli_fetch_array($q)) 
        $k1= $all['Name1'];
        $k2= $all['Name2'];
        $k3= $all['Name3'];
        $k4= $all['Name4'];
        $k5= $all['Name5'];
        $k6= $all['Name6'];
        $arr=array($k1, $k2);
        $total_values = array_count_values($arr);
        foreach ($total_values as $key => $value) 
            echo $key .'-'. $value .'<br>';
        
    

我的输出结果是:

鲍勃-1 亚历克斯-1 伊万-1 尼娜-1 尼娜-1 鲍勃-1 鲍勃-1 伊万-1 尼娜-1 尼娜-1 .......

在数组 $arr 中添加 $k2、$k3....$k6 出了什么问题?

【问题讨论】:

听起来像是crosstab queries 的一个很好的用例。如果您在查询中完成繁重的工作,您将不必使用 PHP 进行大量操作。 【参考方案1】:

这将计算单个名称的出现次数:

$q= mysqli_query($db, 'SELECT * FROM names');
$arr = array();

// 1) loop through rows
while ($all = mysqli_fetch_array($q, MYSQLI_NUM)) 
 // 2) loop through cells in a row
 foreach($all as $val) 
  // 3) 'roll out' the values into a one-dimensional array
  if(empty($val))  continue;  // if you don't want to count empty cells
  $arr[] = $val;
     

// 4) count the number of occurences
$names_qty = array_count_values($arr);

// optional loop that shows the results
foreach($names_qty as $name=>$qty) 
 echo $name.'-'.$qty.'<br />';

此解决方案的好处是您只调用一次计数函数,而不是在每次迭代中。

【讨论】:

为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及这样做的原因,不仅适用于 OP,而且适用于可能会发现此问题并正在阅读您的答案的 SO 的未来访问者。 代码将名字的数字加倍(名字之后)! @BorislavRazvanski 感谢您发现这一点!这是因为mysqli_fetch_array 同时返回了数字键和字符串键,因此每行中的单元格数量增加了一倍。向该函数添加第二个参数后,一切正常。 是的,现在可以工作了!但是在你在函数中添加第二个参数之前,我使用 mysqli_fetch_assoc 而不是 mysqli_fetch_array 并且它工作正常!非常感谢! @BorislavRazvanski 太好了,不客气。它将与这两个功能一起使用。如果我的回答对您有帮助,请考虑接受。谢谢:)。【参考方案2】:

你必须循环累积数据,待所有数据处理完毕后再打印。

$total = array();
$result = mysqli_query($db, 'SELECT * FROM names', MYSQLI_USE_RESULT);
while (mysqli_fetch_assoc($result) as $row) 
    foreach ($row as $col => $value)
        total[$col]++;
    


print_r($total);

【讨论】:

【参考方案3】:

这段代码已经过测试,应该可以解决问题。

<?php
$arr = array();
$q = mysqli_query($db, 'SELECT * FROM names');
while ($all = mysqli_fetch_assoc($q)) 
    foreach($all as $val) 
        if(empty($val)) 
            continue;
        
        // saves all names with the name as key
        $arr[$val][] = $val;
     


// Output
foreach($arr as $k => $v) 
    // count how many times the name was pushed into the array
    echo $k.' - '. count($v);
 

【讨论】:

为什么 OP 应该“试试这个”? 尤其是你承认它未经测试!好的答案总是会解释做了什么以及为什么这样做,不仅是为了 OP,也是为了未来可能会发现此问题并正在阅读您的答案的 SO 访问者。 问题出在哪里?是的,它已经过测试。 它可以工作,但是代码使名称的数字加倍(在名称之后)! 为了防止名称出现双数,我将 mysqli_fetch_array 更改为 mysqli_fetch_assoc 并且代码运行完美!我更新了你的帖子! 我已经更新了我的答案。当你投票赞成这个答案时会很棒。 ;)

以上是关于PHP计算在许多列中包含相同值的MYSQL行的主要内容,如果未能解决你的问题,请参考以下文章

显示 MySQL 中包含相同值的所有行

从不同的相关记录组中选择两列之一中包含重复值的所有行

显示 MySQL 中包含相同值(特定值)的所有行

删除熊猫中多列中包含一段字符串的所有行

COUNT()

在数据框的选定列中包含 NA(缺失)值的行子集