按组输出 - 可能是foreach?

时间:2017-08-31 13:32:44

标签: php mysql loops

我正处于一个项目中,我将来自外部API的JSON数据放到MySQL数据库中。这很好。

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))'];?>
}

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您只是添加行

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

就在你之前     <?=$row['GROUP_CONCAT(DISTINCT (taskName))'];?>

然后替换你的行

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

<?=$holder;?>

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