2017-08-31 145 views
1

我在一个项目中将JSON数据从外部API放到MySQL数据库中。这工作正常。按组输出 - 可能是foreach?

GROUPINGORDER BY输出是不是真的我多么希望它

我得到了什么至今:

SELECT *, GROUP_CONCAT(DISTINCT (task)) 
FROM time_summary 
GROUP BY projectName 
ORDER BY clientName 

表看起来是这样的:

id  clientName   project    task 
1  firm One   online    banner 
2  firm One   print    folder 
3  firm Two   water    with gas 
4  firm One   online    website 
5  firm Two   water    with gas 
6  firm Two   water    with gas 

输出是:

firmOne
 在线
   旗帜,网站
 打印
   文件夹

现在的问题: 的编组任务由逗号分隔。

我有一个while循环输出 - 但是我需要一个像

firmOne
 在新行中的每个任务(由项目分组)在线
   旗帜
   网站
 打印
   文件夹

PHP代码是像这样的:

$new = 1; 

$last_client = 'initial'; 

while($row = _mysql_fetch_array($sql)) { 
    if($last_client != $row['clientName'] && $last_client != 'initial') { 
     echo '<div class="cb h20"></div>'; 
     $new = 1; 
    } 

    if($new == 1) { 
     echo '<span class="yellow-small">' . $row["clientName"] . '</span>'; 
     $new = 0; 
    } 
    ?> 
    <b><?=$row['projectName'];?></b><br> 

     <?=$row['GROUP_CONCAT(DISTINCT (task))'];?> 
} 

我怎样才能做到这一点?

+0

列名和密码不似乎符合???? – RiggsFolly

+0

对不起,只写得太快:D 我修复了它 –

+0

'SELECT *,.... GROUP BY projectName'对SQL的使用不好https://www.psce.com/en/blog/2012/05/15/mysql-errors-do-you-use-group-by-incorrect/ –

回答

1

将任务汇总到CSV中,然后再将它们拆分到您的PHP代码中,这听起来对我来说不是一个好选择。将下面的简单查询不给你你想要的数据:

SELECT DISTINCT 
    clientName, 
    project, 
    task 
FROM time_summary 
ORDER BY 
    clientName, 
    project, 
    task 

上面的查询报告,为每一个客户和项目,只有任务的不同列表。现在,你可以通过这个结果在你的PHP代码中设置重复,以产生你想要的输出:

$client = null; 
$project = null; 

while ($row = _mysql_fetch_array($sql)) { 
    $curr_client = $row['clientName']; 
    if ($curr_client != $client) { 
     echo $curr_client."<br>"; 
     $client = $curr_client; 
    } 

    $curr_project = $row['projectName']; 
    if ($curr_project != $project) { 
     echo " ".$curr_project."<br>"; 
     $project = $curr_project; 
    } 

    echo " ".$row['task']."<br>"; 
} 

输出:

enter image description here

作为一个声明,我专注于查询和演示获取所需显示所需的逻辑,而不是PHP代码。这可能是另一个讨论的话题。

这里是一个小PHP演示一个链接,显示的显示逻辑是可靠的:

Rextester

+0

@RaymondNijland我确定在OP中可能会出现各种不好的PHP事件,并且可能会出现我的答案。我专注于查询和表示逻辑。 –

+0

这是一个函数pdo .. function _mysql_fetch_array(){ \t return $ GLOBALS ['_ pdo_s'] - > fetch(PDO :: FETCH_ASSOC); } –

+0

谢谢,这工作! –

0

如果简单地将线

$holder = str_replace(",", "<br>", $row['GROUP_CONCAT(DISTINCT (taskName))']);

权之前,你的 <?=$row['GROUP_CONCAT(DISTINCT (taskName))'];?>

,然后替换你的行

<?=$row['GROUP_CONCAT(DISTINCT (taskName))'];?>

<?=$holder;?>

这会将逗号替换为<br>,并将强制第二个值到下一行。