У меня возникают некоторые проблемы, пытаясь получить данные из моей базы данных и показать их правильно. У меня есть макет, где у меня есть два «списка», где я могу добавлять строки в каждый список. Я могу добавить несколько строк в каждый список.
Я хочу отобразить вывод, поэтому сначала отображается первый список вместе со всей его строкой, а затем второй список вместе с его строками.
В настоящее время это проявляется так:
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
, потому что он находится в обеих таблицах. Вероятно, вы должны явно указывать столбцы, которые вы хотите, из обеих таблиц, и избегать избыточных столбцов.