Вложение второго запроса в список уникальных значений столбцов

Новичок здесь, будьте нежны, пожалуйста. У меня есть таблица, в которой один столбец - это названия книг, а другой - их соответствующие авторы. Я использую PDO для подключения к базе данных и отображения результатов запроса на веб-странице. По сути, я хочу, чтобы каждый УНИКАЛЬНЫЙ автор отображался один раз, а затем список названий каждой книги, которую автор написал ниже, например:

Author 1
title1
title2

Author 2
title3
title4

Запрос для получения списка отдельных авторов:

<?php try {

$connection = new PDO($dsn, $username, $password, $options);

$sql = "SELECT DISTINCT author FROM booktable;"

$statement = $connection->prepare($sql);

$result = $statement->fetchAll();

} ?>

Цикл Foreach для отображения каждого автора:

<?php foreach ($result as $row) { ?>

     <p><?php echo ($row["author"]); ?></p>

<?php } ?>

Пока все хорошо, это дает мне список уникальных авторов. Для заголовков я пытался сделать еще один цикл foreach, вложенный в первый, чтобы отобразить второй запрос, но я не могу понять, как получить только автора, в котором цикл находится в данный момент. Я попытался установить переменную внутри цикла следующим образом:

<?php foreach ($result as $row) { ?>

     <p><?php echo ($row["author"]); ?></p>

     <?php $currentauthor = ($row["author"]); ?>

     <?php foreach ($result2 as $row2) { ?>

          <p><?php echo ($row2["title"]); ?></p>

     <?php } ?>

<?php } ?>

А затем добавить еще один запрос в мой исходный TRY (вместе с соответствующим новым оператором подключения и выборки):

$sql2 = "SELECT * FROM booktable WHERE author = '$currentauthor'";)

Но это ничего не возвращает, потому что переменная $currentauthor не существует вне цикла foreach. Итак, моя проблема. Я иду об этом неправильно?

Что не так с соединениями?

Strawberry 29.05.2019 21:41

Я понятия не имею, что такое соединение, если честно. Я очень новичок в этом.

mkb 29.05.2019 21:43

Я действительно думаю, что любая вводная книга или учебник по MySQL (и MySQL, и PHP) будут чрезвычайно полезны.

Strawberry 29.05.2019 21:48

Разве это не объединение двух или более таблиц? У меня только один стол.

mkb 29.05.2019 21:51

Нет. Соединения предназначены для соединения экземпляров таблиц, будь то 1, 2 или 1000.

Strawberry 29.05.2019 21:52
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
5
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы должны иметь возможность делать то, что пытаетесь, с помощью одного запроса без соединения. Вы можете использовать SELECT * FROM booktable ORDER BY author и прокручивать его результаты, выводя данные об авторе только тогда, когда вы обнаружите, что текущая запись имеет другого автора, чем предыдущая (и, очевидно, для первой записи).

Примечание, поскольку вы новичок: * в SELECT * обычно считается плохой формой для окончательных развернутых запросов; Я просто использовал его здесь как заполнитель, так как я не знаю всех полей, из которых вам нужны данные. Лучше всего указать все поля, которые вы будете использовать, так как это: (1) документирует используемые данные без необходимости проверки всего кода, который работает с данными, (2) делает запрос менее уязвимым, не зависящим от определения таблицы. для порядка столбцов (3) прерывает запрос, если используемое поле удаляется из таблицы, а не более поздний код, который предполагает, что значение будет там (которое затем должно быть отслежено до запроса), (4) сохраняет количество данных, которые необходимо собрать вместе и передать только то, что необходимо, и (5) больше...

На самом деле я просто пробовал что-то подобное, и это ДЕЙСТВИТЕЛЬНО работало (в основном создавало пустую переменную для автора, записывало в нее каждый цикл и проверяло ее против себя), но я не мог понять, как разбить результаты на страницы на основе автора вместо количества книг. Но это совсем другой вопрос, я думаю.

mkb 29.05.2019 22:17

Я использую * в большинстве своих запросов, потому что мне буквально нужны все столбцы для проекта, который я делаю. Так что все же было бы лучше перечислить столбцы, которые я хочу?

mkb 29.05.2019 22:22

Если это всего лишь небольшой проект по самообучению, над которым вы и только вы когда-либо будете работать и, вероятно, никогда не вернетесь к нему; это, наверное, хорошо. Это больше проблема больших систем с несколькими разработчиками или долгосрочной разработки, когда это становится действительно важным. В качестве крайнего примера представьте, что у вас есть таблица «продукты». Начиная с проекта, у него есть немного больше, чем идентификатор, имя и цена; поэтому вы выбираете *, чтобы получить список продуктов... позже кто-то добавил идентификатор поля большого двоичного объекта для фотографии с высоким разрешением для каждого продукта; теперь ваши текстовые списки загружают множество файлов, которые они на самом деле не используют.

Uueerdo 29.05.2019 23:45

Спасибо за помощь.

mkb 30.05.2019 15:38

Другие вопросы по теме