Загрузка данных из MySQL в таблицу по горизонтали - PullRequest
0 голосов
/ 01 мая 2018

Я загружаю некоторые данные из базы данных MySQL, и это выглядит так:

| Gray |  S  |
| Gray |  M  |
| Gray |  L  |
| Red  |  S  |
| Red  |  M  |
| Red  |  L  |

Я хочу загрузить данные в мою таблицу горизонтально, сгруппированные по цвету:

| Gray |  S  |  M  |  L  |  XL  |
| Red  |  S  |  M  |  L  |  XL  |

Вот мой код:

<table>
<?php foreach($products as $product) {?>
    <tr>
    <td><?php echo $product['color'];?></td>
    <td><?php echo $product['size'];?></td>
    </tr>       
<?php   }
?>      
</table>

Вопрос: как загрузить данные в мою таблицу, сгруппированные по цветам в одну строку? Могу ли я сделать это без отдельного запроса MySQL?

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Вы можете попробовать в php. Преобразуйте результат в массив и используйте цикл for вместо цикла foreach, и вы можете перебрать первый столбец как строку, а затем второй столбец как строку, используя счетчик.

0 голосов
/ 01 мая 2018

Чтобы получить результат от MySQL, мы могли бы сделать что-то вроде этого:

SELECT t.color
     , MAX(IF(t.size='S' ,t.size,NULL)) AS size_s
     , MAX(IF(t.size='M' ,t.size,NULL)) AS size_m
     , MAX(IF(t.size='L' ,t.size,NULL)) AS size_l
     , MAX(IF(t.size='XL',t.size,NULL)) AS size_xl
  FROM mytable t
 WHERE ...
 GROUP BY t.color

Обратите внимание, что запрос ожидает только определенные значения для размера. Если бы в таблице MySQL был размер «XS» или «XXL», этот запрос игнорировал бы эти значения.

Так что этот подход лучше всего подходит для столбцов, которые имеют статические, четко определенные домены (список допустимых значений).

Чтобы этот подход был более динамичным и возвращать результирующий набор, как показано, нам потребуется предварительный запрос для получения списка значений, а затем динамическое построение оператора SQL для выполнения.

Но как только мы пойдем по этому пути, вероятно, было бы лучше просто извлечь значения, как они есть, из MySQL с помощью простого запроса, и выполнить обработку в клиенте, чтобы «развернуть» строки в столбцы для представления. .

0 голосов
/ 01 мая 2018

Немного ручной итерации будет вашим другом ...

$DatabaseResult = [ ['Gray','S'],['Gray','M'],['Gray','L'],['Red','S'],['Red','M'],['Red','L'] ];

$Grouped = array_fill_keys( array_unique( array_column( $DatabaseResult, 0 ) ), array() );

foreach( $DatabaseResult as $row )
{
  $Grouped[ $row[0] ][] = $row[1];
}

print_r( $Grouped );

//Array
//(
//    [Gray] => Array
//        (
//            [0] => S
//            [1] => M
//            [2] => L
//        )
//
//    [Red] => Array
//        (
//            [0] => S
//            [1] => M
//            [2] => L
//        )
//)

Затем вы создадите две петли, внешняя строка - ваш «цветной», а внутренняя - ваш столбец «size»

<table border="1">
  <?php foreach( $Grouped as $colour => $sizes ) {?>
    <tr>
      <td><?php echo $colour;?></td>
      </td>
      <?php foreach($sizes as $size) {?>
        <td><?php echo $size;?></td>
      <?php } ?>
    </tr>
  <?php } ?>
</table>

Кроме того, если вам нужно распечатать таблицу размеров, вы можете сделать это ...

$Products = [
  ['color'=>'Gray','size'=>'S','quantity'=>2],
  ['color'=>'Gray','size'=>'M','quantity'=>4],
  ['color'=>'Gray','size'=>'L','quantity'=>7],
  ['color'=>'Red','size'=>'S','quantity'=>8],
  ['color'=>'Red','size'=>'M','quantity'=>6],
  ['color'=>'Red','size'=>'XXL','quantity'=>1],
];

// Helper function to locate products from the array
function SearchProductArray( $products, $color, $size )
{
  foreach( $products as $product )
  {
    if( $product[ 'color' ] == $color and $product[ 'size' ] == $size )
    {
      return $product;
    }
  }
  return false;
}

// Locate all the unique Values
$Colours = array_unique( array_column( $Products, 'color' ) );
$Sizes = ['SS','S','M','L','XL','XXL'];

?>

<table border="1">
  <tr>
    <td>Colour</td>
    <?php foreach( $Sizes as $Size ) {?>
      <td><?php echo $Size;?></td>
    <?php } ?>
  </tr>
  <?php foreach( $Colours as $Colour ) {?>
    <tr>
      <td><?php echo $Colour;?></td>
      <?php foreach( $Sizes as $Size ) { $Product = SearchProductArray( $Products, $Colour, $Size ); ?>
        <td><?php echo ( $Product ) ? $Product['quantity'] : '&nbsp'; ?></td>
      <?php } ?>
    </tr>
  <?php } ?>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...