пятница, 7 октября 2011 г.

MySQL. Формирование выходных данных.

В посте "MySQL.JOIN.примеры." остался нерассмотренным вопрос формирования данных в удобный для обработки вид.
Рассмотрим этот вопрос.
Исходная база тут
Исходный код такой обработки:
<?PHP
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
 
$query = '
 SELECT 
  b.id bid, b.name book, 
  a.id aid, a.name author
 FROM library l
 INNER JOIN authors a ON l.auth_id = a.id
 INNER JOIN books b ON l.book_id = b.id
 '; 

$result = $db->query($query);

$library = array();
$lib_list = array();

while($row = $result->fetch_array()){
 $auths=array();
 if (
  isset($lib_list[$row['bid']]['auths']) 
  && 
  count($lib_list[$row['bid']]['auths']
  )) 
  {
  $auths = $lib_list[$row['bid']]['auths'];
  // сохраняем авторов, которые уже есть
  }
 $auths = array_merge($auths, (array)$row['author']);
 // добавляем нового автора
 
 $lib_list[$row['bid']] = array(
  'book_id'=>$row['bid'],
  'book_name'=>$row['book'],
  'auths'=>$auths
  );
 }
$db->close();

if (count($lib_list)){
?>
 <table>
  <tr>
   <th>Книга
   <th>Авторы
  </tr>
<?PHP 
  foreach ($lib_list as $key=>$lib_rec) {
   echo '<tr>';
    echo '<td>'.$lib_rec['book_name'].'</td>';
    echo '<td>'.implode(', ',$lib_rec['auths']).'</td>';
   echo '</tr>';
   }
?>
 </table>
<?PHP
 }
?>
Результирующая таблица имеет вид:
Книга Авторы
Мир героев Николай Андреев
Лучшие из мертвых Николай Андреев
Яд для живых Николай Андреев
Сектор мутантов Николай Андреев
Геном Сергей Лукьяненко
Танцы на снегу Сергей Лукьяненко, Николай Андреев

Комментариев нет:

Отправить комментарий