如何获取GROUP CONCAT(php,mysql)的每个不同值的出现次数

Posted

技术标签:

【中文标题】如何获取GROUP CONCAT(php,mysql)的每个不同值的出现次数【英文标题】:How to get the number of occurrence of each distinct value of GROUP CONCAT (php,mysql) 【发布时间】:2015-09-14 06:44:40 【问题描述】:

我知道这很容易做到,但我没有找到正确的方法。我找到了Here 的东西,但与我需要的不同,还没有积极的贡献。有人好心帮忙。

我有一张这样的桌子

name |status
-------------
mike |yes
mike |yes
mike |no
mike |ney
john |no
john |ney
john |yes

我想输出这样的东西

name |status           |total
------------------------------
mike |yes-2,no-1,ney-1 | 4
john |yes-1,no-1,ney-1 | 3

我尝试像这样使用 GROUP_CONCAT

    result = mysql_query("SELECT name, GROUP_CONCAT(DISTINCT status) AS status 
FROM table GROUP BY name ");
        while($row = mysql_fetch_array($result)) 
    $st[] = $row['status'];
            $status=explode(",",$row['status']);
            $total = count($status);
            echo $row['name']."|".$row['status']."|".$total."<br><br>"; 

我想获取每个不同的$row['status'] 的数量,如果可能的话,还有一个更好的方法来到达$total

EDIT1

name | yes | no | ney | total
------------------------------
mike |2    |1   |1    | 4
john |1    |1   |1    | 3

第二个输出达到Here

【问题讨论】:

【参考方案1】:

无需使用php,使用纯SQL即可获得想要的结果集:

SELECT name, GROUP_CONCAT(totalPerStatus) AS status, 
       (SELECT COUNT(*) FROM mytable WHERE name = t.name) AS total
FROM (
  SELECT name,      
         CONCAT(status, '-', COUNT(*)) AS totalPerStatus            
  FROM mytable
  GROUP BY name, status ) t
GROUP BY name;

在子查询中执行的name, status 分组为您提供每个“名称”每个“状态”的计数。使用CONCAT 会产生以下结果集:

name    totalPerStatus
-----------------------
john    ney-1
john    no-1
john    yes-1
mike    ney-1
mike    no-1
mike    yes-2

外部查询在totalPerStatus 上使用GROUP_CONCAT 来生成所需的结果集。

Demo here

【讨论】:

我相信您的答案应该有效,但请检查,我认为我有语法错误。 $result = mysql_query("SELECT name, GROUP_CONCAT(totalPerStatus) AS status (SELECT COUNT(*) FROM table WHERE name = t.name) AS total FROM (SELECT name,CONCAT(status, '-', COUNT(*)) AS totalPerStatus FROM table GROUP BY name, status ) t GROUP BY name; ") ; while($row = mysql_fetch_array($result)) echo $row['name']."-".$row['status']."-".$row['totalPerStatus']."-".$row['total']; @scylla “AS 状态”后缺少逗号 SQL 运行良好,但当我尝试验证每个 $row 中的数据输出时,我的 echo 命令返回致命错误。即$row['name'], $row['status'], $row['totalPerStatus']。我该怎么做?致命错误:不能使用 stdClass 类型的对象作为数组 in @scylla 恐怕我帮不了你。距离我上次用 php 写一些代码已经至少十年了 :( 这是我的错误。在摆弄代码时使用 mysql_fetch_object 而不是 mysql_fetch_array 。这很棒。

以上是关于如何获取GROUP CONCAT(php,mysql)的每个不同值的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL SELECT 从多个表,多个 GROUP BY 和 group_concat?

如何在 sql [重复] 中使用 group_concat() 获取不同的值

如何使用 Google Big Query 在 GROUP_CONCAT 上获取不同的值

在 clickhouse 上使用类似 group_concat 的东西

如何破解 MySQL GROUP_CONCAT 以获取有限数量的行?

如何破解 MySQL GROUP_CONCAT 以获取有限数量的行?