Список записей, сгруппированных по названию категории

У меня возникают некоторые проблемы, пытаясь получить данные из моей базы данных и показать их правильно. У меня есть макет, где у меня есть два «списка», где я могу добавлять строки в каждый список. Я могу добавить несколько строк в каждый список.

Я хочу отобразить вывод, поэтому сначала отображается первый список вместе со всей его строкой, а затем второй список вместе с его строками.

В настоящее время это проявляется так:

LIST #1 -- row inside list #1 -- -- row inside list #1 -- LIST #2 -- row inside list #2 -- 

В настоящее время он отображается следующим образом:

  LIST #1 -- row inside list #1 -- LIST #2 -- row inside list #2 -- LIST #1 -- row inside list #1 -- 

Ниже приведено изображение:

Проблема визуализирована

Это мой выбор в PHP:

  $driving=$dbh->prepare("SELECT driving_lists.id, driving_lists.list_id, driving_lists.date, driving_lists.list_name, driving_list_shipments.* FROM driving_lists LEFT JOIN driving_list_shipments ON driving_lists.list_id = driving_list_shipments.list_id "); $driving->execute(); 

И выходной скрипт:

 foreach( $driving as $row){ echo "<pre>"; echo $row["list_name"]; echo "<br />"; echo $row["reference"]; echo "</pre>"; } 

Что я делаю не так?

К счастью, вы используете PDO, у которого уже есть эта функция для вас, которая может делать именно то, что вы хотите – группировать данные на основе некоторого столбца.

PDO может группировать результаты во вложенные массивы , основываясь на первом выбранном поле. Поэтому вам нужно указать свой идентификатор списка в качестве первого поля в списке полей, а затем получить свои строки с помощью fetchAll() с вышеупомянутым режимом выборки:

 $sql = "SELECT dl.list_id, dl.id, dl.date, dl.list_name, dls.* FROM driving_lists dl LEFT JOIN driving_list_shipments dls ON dl.list_id = dls.list_id ORDER BY dl.list_id"; $driving = $dbh->query($sql)->fetchAll(PDO::FETCH_GROUP); 

и теперь вы получаете аккуратный вложенный массив, где ваши строки сгруппированы по идентификатору списка!

Чтобы сделать его выводным, вы должны использовать два вложенных оператора foreach

 foreach ($driving as $list_id => $list_data) { echo $list_data[0]['list_name']."<br />\n"; foreach ($list_data as $row) { echo "whatever"; } } 

Если вы запустите SQL-запрос и хотите получить результат в определенном порядке, тогда ВСЕГДА включите предложение order by .

В вашем случае вы, похоже, хотите:

 SELECT dl.id, dl.list_id, dl.date, dl.list_name, dls.* FROM driving_lists dl LEFT JOIN driving_list_shipments dls ON dl.list_id = dls.list_id ORDER BY dl.list_id; 

Я предполагаю, что list_id – это то, что вы имеете в виду под list_id .

Я должен отметить, что у вас есть list_id появляющийся дважды в SELECT , потому что он находится в обеих таблицах. Вероятно, вы должны явно указывать столбцы, которые вы хотите, из обеих таблиц, и избегать избыточных столбцов.