2017-08-30 5 views
0

Ich wollte Projektnamen trennen durch Gruppierung dann zeigen Sie die Details. Basierend auf meinen Codes zeigt es die Details aber nur in einer Zeile. Plus ich habe keine die Summenfunktion.PHP MYSQL auf der Suche nach einer Möglichkeit, Zeilen mit mehreren Details und Summen zu gruppieren

Ausgabe wie folgt

   Month | Contract Amount | Investment | Expense 
Project Name 1 
       Jan | $9000   | $9000  | $100 
       Feb | $10000   | $5000  | $500 
Total:    | $19000   | $14000  | $600 
Project Name 2 
       Jan | $50000   | $2500  | $10000 
       Feb | $10000   | $5000  | $500 
       Mar | $20000   | $4500  | $1500 
Total:    | $80000   | $12000  | $1200 

Mein Quellcode sein sollte.

Projektname ist "pn"

<?php 
$pdo = Database::connect(); 

$sql = 'SELECT *, tt_projects.name as pn, tt_projects.id 
FROM tt_client_project_binds 
INNER JOIN tt_projects 
ON tt_client_project_binds.project_id = tt_projects.id 
INNER JOIN rms_projects_budget 
on rms_projects_budget.project_id = tt_projects.id'; 

$stmt = $pdo->prepare($sql); 
$stmt->execute(); 

$categories = array(); 
while (($row = $stmt->fetch(PDO::FETCH_ASSOC))) 
{ 

    $category = $row['pn']; 
    $categories[$category][] = date('F', strtotime($row['month'])); 
    $categories[$category][] = $row['pn']; 
    $categories[$category][] = $row['Contract_Amount']; 
    $categories[$category][] = $row['investment']; 
    $categories[$category][] = $row['expense']; 

} 

?> 
<html> 
    <body> 
<?php 
foreach ($categories as $category => $consumption) 
    { 
?> 
<table class="table table-striped table-bordered"> 

<thead> 
<tr> 
<th>Month</th> 
<th>Contract Amount</th> 
<th>Investment</th> 
<th>Expense</th> 
</tr> 
</thead> 
<tbody> 

<h4><?php echo $category; ?></h4> 

<?php 
foreach ($consumption as $details) 
    { 
?> 
<td><?php echo $details; ?></td> 
<?php 
    } 
?> 
<?php 
    } 
?> 
    </body> 
     </html> 

würde ich sehr schätzen für Sie helfen. Vielen Dank im Voraus!

+0

1. Verwenden Sie kein böses 'SELECT *'. Benennen Sie die gewünschten Spalten. 2. Siehe über Tabellenaliase. Sie machen den Code leichter lesbar und bedeuten weniger Tipparbeit. – Strawberry

+0

Fertig, Danke! – Beni

+0

Können Sie kurz die Tabellenstruktur von tt_client_project_binds, tt_projects, rms_projects_budget erklären? –

Antwort

0

Okay, hier ist ein kurzer Hack, um die Dinge in Gang zu bringen, es gibt wahrscheinlich eine viel bessere Lösung als meine, aber das funktioniert. xD

PS: Ich bin unter der Annahme der Tabellenstruktur ist ähnlich der, die ich eingerichtet haben bei http://rextester.com/PJJML53507

Und hier ist der Ausgang: http://rextester.com/HATU87511

<?php 

$pdo = Database::connect(); 

$sql = <<<SQL 
    SELECT p.name, group_concat('{"month":', pb.month,',"amount":[', pb.contract , ',', pb.investment, ',', pb.expense, ']}') AS detail, 
    sum(pb.contract) AS sum_contract, sum(pb.investment) as sum_investment, sum(pb.expense) as sum_expense 
    FROM tt_projects p 
    INNER JOIN rms_projects_budget pb 
    ON p.ID = pb.project_id 
    GROUP BY p.name; 
SQL; 

$stmt = $pdo->prepare($sql); 
$stmt->execute(); 

$rows = $stmt->fetchall(); 

// Output - added \n for better viewing, you can remove it. 

echo "<table><thead><th></th><th>Month</th><th>Contract Amount</th><th>Investment</th><th>Expense</th></thead>\n"; 

foreach ($rows as $row) { 
    echo "<tr><td>" . $row['name'] . "</td><td colspan=4></td></tr>\n"; 
    $details = json_decode('{"detail":[' . $row['detail'] . ']}', true)['detail']; 
    foreach($details as $detail) { 
     $month = $detail['month']; 
     echo "<tr><td></td><td>$month</td><td>" . implode("</td><td>", $detail['amount']) . "</td></tr>\n"; 
    } 
    echo "<tr><td colspan=2>Total:</td><td>" . $row['sum_contract'] . "</td><td>" . $row['sum_investment'] . "</td><td>" . $row['sum_expense'] . "</td></tr>\n"; 
} 

echo "</table>\n"; 
?> 

Die Idee der Die Lösung besteht darin, die Detailausgaben in einen JSON-Code zusammenzufassen, und die SQL-Funktion übernimmt die meiste Arbeit anstelle von PHP.

Mithilfe von json_decode() können Sie die Monate und die Menge sofort in die entsprechenden Arrays formatieren. Sobald das erledigt ist, können Sie praktisch alles machen, was Sie wollen.

Ich habe auch die Summenspalten am Ende hinzugefügt, nur um nicht eine andere Variable zu schreiben, um die Summen zu speichern.

Verwandte Themen