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

0

Привет всем. Хотя я пытаюсь изучить некоторые PHP и mySQL, у меня возникла проблема, с которой я столкнулся с трудностями при решении. Мне нужен PHP script, который запрашивает базу данных 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  |
+----------------------------------------------------+

Спасибо

Теги:

4 ответа

0
Лучший ответ
$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;
0

Проверьте это!

<?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>";  
0

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

$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>';
0

Try:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню