как сгруппировать результат в подгруппы в php

Всем привет. Хотя я пытаюсь изучить некоторые PHP и mySQL, у меня возникла проблема, с которой я столкнулся с трудностями при решении. Мне нужен PHP-скрипт, который запрашивает базу данных mySQL для страны, книг, book_price. Вот мой dbtable:

+----+-------+----------+------------------------+ | id |Country|Books | Book_price | +----+-------+----------+------------------------+ | 1 | USA | Zorro | 10 | | 2 | USA | Zorro | 20 | | 3 | USA | Zorro | 50 | | 4 | USA | Leon | 200 | | 5 | USA | Leon | 240 | | 6 | ITALY| Tarzan | 70 | | 7 | ITALY| Tarzan | 30 | | 8 | ITALY| Tarzan | 100 | | 9 | ITALY| Cobra | 300 | | 10 | ITALY| Cobra | 320 | | 11 | ITALY| Cobra | 350 | +----+------+-----------+------------------------+ 

Я хочу организовать результаты, основанные на стране, книгах, общей книге, общей стране и TOTAL GEN (которая является суммой всей страны), и результат должен выглядеть следующим образом:

 +----------------------------------------------------+ | USA | +----------------------------------------------------+ | Zorro 10 | | 20 | | 50 | +----------------------------------------------------+ | Total Zorro: 80 | +----------------------------------------------------+ | Leon 200 | | 240 | +----------------------------------------------------+ | Total Leon:440 | +----------------------------------------------------+ |Total USA: 520 | +----------------------------------------------------+ |ITALY | +----------------------------------------------------+ | Tarzan 70 | | 30 | | 100 | +----------------------------------------------------+ | Total Tarzan:200 | +----------------------------------------------------+ | Cobra 300 | | 320 | | 350 | +----------------------------------------------------+ | Total Cobra: 970 | +----------------------------------------------------+ |Total ITALY: 1170 | +----------------------------------------------------+ |TOTAL GEN: 1690 | +----------------------------------------------------+ 

спасибо

 $conn = mysql_connect("localhost", "mysql_user", "mysql_password"); mysql_select_db("mydbname"); $sql = 'SELECT * FROM table_name'; $result = mysql_query($sql); $data = array(); while ($row = mysql_fetch_assoc($result)) { if ( empty($data[ $row['Country'] ]) ) { $data[ $row['Country'] ] = array(); } if ( empty( $data[ $row['Country'] ][ $row['Books'] ] ) ) { $data[ $row['Country'] ][ $row['Books'] ] = array(); } $data[ $row['Country'] ][ $row['Books'] ][] = $row['Book_price']; } $totalSum = 0; foreach ( $data as $country => $books ) { echo '<b>' . $country . '</b><br/>'; $totalCountry = 0; foreach ( $books as $book => $prices ) { $sum = array_sum( $prices ); echo '<u>' . $book . '</u><br/>'; echo implode(',', $prices) . '<br/>; echo 'Total ' . $book . ':' . $sum . '<br/>'; $totalCountry += $sum; } echo 'Total ' . $country . ':' . $totalCountry . '<br/>'; echo '<hr/>'; $totalSum += $totalCountry; } echo 'TOTAL GEN: ' . $totalSum; 

Используйте дополнительные переменные, которые содержат последнюю страну / книгу и их промежуточные итоги:

 $last = array('Country' => null, 'Books' => null); $subtotals = array('Country' => 0, 'Books' => 0); echo '<table>'; while ($row = mysql_fetch_assoc($result)) { if ($row['Books'] !== $last['Books']) { if (!is_null($last['Books'])) { echo '<tr><td colspan="2">Total '.$last['Books'].': '.$subtotals['Books'].'</td></tr>'; } $last['Books'] = $row['Books']; $subtotals['Books'] = $row['Book_price']; } else { $subtotals['Books'] += $row['Book_price']; } if ($row['Country'] !== $last['Country'])) { if (!is_null($last['Country'])) { echo '<tr><td colspan="2">Total '.$last['Country'].': '.$subtotals['Country'].'</td></tr>'; } echo '<tr><th colspan="2">'.$row['Country'].'</th></tr>'; $last['Country'] = $row['Country']; $subtotals['Country'] = $row['Book_price']; } else { $subtotals['Country'] += $row['Book_price']; } echo '<tr><td>'.$row['Books'].'</td><td>'.$row['Book_price'].'</td></tr>'; } echo '</table>'; 

Пытаться:

  SELECT country, books, SUM(price) FROM sales GROUP BY country, books WITH ROLLUP; 

Строки, где книги имеют значение null, возвращают общее количество для каждой страны. Строка, где Страна и Книги имеют значение null, равное нулю для всего запроса.

Проверь это !

 <?php include ("config.php"); function render($price3) { $output = "<td align='right'>".number_format($price3->book_price, 0, ',', '.')."</td>"; $output .= "</tr>"; return $output; } echo "<table border='1'>"; echo "<tr> <th>books</th> <th>price</th> </tr>"; $result = mysql_query("select id, country, books, book_price from test") or die(mysql_error()); $set = array(); while ($record = mysql_fetch_object($result)) { $set[$record->country][$record->books][] = $record; } $sum_country = 0; foreach ($set as $country => $price1) { echo "<tr> <td align='center'>{$country}</font></td> <td></td> </tr>"; foreach ($price1 as $books => $price2 ) { echo "<tr> <td>{$books}</td>"; foreach ($price2 as $price3) { echo render($price3); } $sum_books = 0; foreach($price2 as $grbooks){ $sum_books += $grbooks->book_price; } echo "<tr><td>Total {$books}</td> <td align='right'>".number_format($sum_books, 0, ',', '.')."</td> </tr>"; } $sum_country += $sum_books; echo "<tr<td>Total {$country}</td> <td align='right'>".number_format($sum_country, 0, ',', '.')."</td> </tr>"; } echo "</table>";