2015-06-27 13 views
3

我知道这是非常容易做的事情,但我还没有得到正确的方法来做到这一点。我发现了一些东西Here但不同于我所需要的并且没有积极贡献。有人友好协助。如何获得GROUP CONCAT的每个不同值的出现次数(php,mysql)

我有这样

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

回答

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 

外查询使用上totalPerStatusGROUP_CONCAT以产生所需的结果集。

Demo here

+0

我相信你的答案应该工作,但请您检查,我想我有一个语法错误。 (*)表达式中的数据类型为'SELECT',CONCAT('status',' - ',COUNT(*)) )AS totalPerStatus FROM表GROUP BY名称,状态)t GROUP BY name;“); while $($ row = mysql_fetch_array($ result)){\t \t echo $ row ['name']。“ - ”。$ row ['status']。“ - ”。$ row ['totalPerStatus']。“ - ” $行[ '总']; }' – scylla

+1

@scylla'AS状态'后缺少一个逗号 –

+0

SQL很好,但我的echo命令返回致命错误,因为我试图验证每个$行中的数据输出。即$ row ['name'],$ row ['status'],$ row ['totalPerStatus']'。我如何去做这件事?致命错误:无法使用类型为stdClass的对象作为 – scylla

相关问题