Что я должен делать с пользовательским GROUP BY в SQL и PHP? - PullRequest
0 голосов
/ 09 декабря 2018

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

У меня есть таблица sql, как это:

+----+-------+--------+-------+
| No | data1 | detail | price |
+----+-------+--------+-------+
|  1 | ID1   | Food   | $ 100 |
|  2 | ID1   | Drink  | $ 25  |
|  3 | ID2   | Drink  | $ 25  |
|  4 | ID1   | Snack  | $ 50  |
|  5 | ID2   | Snack  | $ 50  |
+----+-------+--------+-------+

Я хочу сделать результат на своей странице php следующим образом:

+----+-------+--------+-------+
| No | detail_lunch   | price |
+----+-------+--------+-------+
|  1 | Food           |       |
|    |  - ID1         | $ 100 |
|  2 | Snack          |       |
|    |  - ID1         | $ 25  |
|    |  - ID2         | $ 25  |
|  3 | Drink          |       |
|    |  - ID1         | $ 10  |
|    |  - ID2         | $ 10  |
+----+-------+--------+-------+

Я уже пробовал с GROUP CONCAT, как показано ниже:

Контроллер:

$d['data'] = $this->db->query("select detail_item, GROUP_CONCAT (detail) detail_lunch 
            from table ORDER BY detail_lunch ASC");

Просмотров:

<?php
    foreach($data->result_array() as $d)
    {
    ?>
      <tr>
        <td><?php echo $no; ?></td>
        <td><?php echo $d['detail_lunch']; ?></td>
        <td><?php echo $d['price']; ?></td>
      </tr>
    <?php
        $no++;
    }
?>

Мой код выше не работает, есть какие-либо предложения по решению моей проблемы?

спасибо ...

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

GROUP BY не требуется, так как вы не используете агрегатную функцию (объединение двух строк значений в одно значение) , вы пытаетесь создать сводную таблицу, (объединениедва столбца под связанным столбцом в виде нескольких строк) .Вам нужно только ORDER BY detail ASC, data1 ASC, выполнить итерацию по набору результатов, чтобы отобразить detail при его изменении, в противном случае отобразить data1 и price

Пример: https://3v4l.org/7tVDS

Запрос:

$data = $this->db->query('SELECT data1, detail, price 
        FROM table ORDER BY detail ASC, data1 ASC');

Просмотр:

<?php

//...

$no = 1;
$currentDetail = null;
foreach ($data->result_array() as $d) { 
    if ($d['detail'] !== $currentDetail) { ?>
    <!-- Only Show the Detail when changed -->
    <tr>
        <td><?php echo $no++; ?></td>
        <td><?php echo $d['detail']; ?></td>
        <td>&nbsp;</td>
    </tr>
 <?php } ?>
 <!-- Always show the data1/price on subsequent row -->
  <tr>
       <td>&nbsp;</td>
       <td>- <?php echo $d['data1']; ?></td>
       <td><?php echo $d['price']; ?></td>
  </tr>
<?php 
    $currentDetail = $d['detail'];
} ?>

Результат:

| 1 | Food |
| - ID1 | $ 100 |
| 2 | Drink |
| - ID1 | $ 25 |
| - ID2 | $ 25 |
| 3 | Snack |
| - ID1 | $ 50 |
| - ID2 | $ 50 |

Кроме того, вы можете управлять отображением данных в вашем представлении, например, используя неупорядоченный список ul в столбце таблицы сведений td вместе с ценой.Используя PHP для упорядочения значений так, как вы хотите, чтобы они отображались в вашем представлении, в организованном ассоциативном массиве.

Пример: https://3v4l.org/8sIrR

$dataArray = [];
foreach ($data as $d) { 
   if (!array_key_exists($d['detail'], $dataArray)) {
        $dataArray[$d['detail']] = [];
   }
   $dataArray[$d['detail']][] = $d;
}


//...

$no = 1;
foreach ($dataArray as $detail => $d) { ?>
    <tr>
        <td><?php echo $no++; ?></td>
        <td>
            <?php echo $detail; ?>
            <ul>
            <?php foreach ($d as $v) { ?>
                <li><?php echo $v['data1']; ?> <?php echo $v['price']; ?></li>
            <?php } ?>
            </ul>
        </td>
    </tr>
<?php } ?>
0 голосов
/ 09 декабря 2018

Запрос - это проблема.Выберите detail_lunch из группы таблиц по деталям.Тогда вы можете использовать оператор if на этот результат.Я обновлю свой ответ после того, как приступлю к работе на компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...