2017-08-31 47 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>,並將強制第二個值到下一行。