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

时间:2015-06-27 10:57:37

标签: php mysql group-concat

我知道这很容易做到,但我还没有找到正确的方法。我发现了一些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 个答案:

答案 0 :(得分:4)

不需要使用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

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

Demo here