Проблема с выборкой данных из бд mysql

161
03 декабря 2018, 02:10

Сразу к делу. Есть задача вывести из бд на странице например: список книг и рядом должен быть автор(имя автора) конкретной книги. Так же вывести автора и рядом должен быть список книг которые он написал. Есть две таблицы в бд:

Я предполагаю что для этого необходимо связать таблицы (один ко многим). Что я и попытался сделать на примере. Но вот в голову не приходит как правильно составить запрос и отобразить на странице именно так как я описал выше или связать правильно таблицы подскажите пожалуйста. Простой запрос на выборку данных получается сформировать 'SELECT * From books' который выводит все данные из бд а вот как правильно сделать вывод книг и что б соответсвующий автор выводился тут я затупил просто(. Заранее спасибо за понимание.

Answer 1

1. Запрос, который выведет автора рядом с книгой

SELECT b.*, w.name FROM books b LEFT JOIN writers w ON w.id = b.writer_id

Сразу же обращу внимание, что в запросе намеренно указал writer_id вместо указанного Вами столбца id_writer. Дело в том, что есть некие паттерны названия столбцов, таблиц и отношений, которых следует придерживаться для поддерживаемого и масштабируемого проекта. К примеру, названия таблиц пишется множественным числом, столбцы, которые ссылаются на внешние таблицы, называются по паттерну {foreign table name}_{foreign table column} и так далее. Советую почитать об этих паттернах побольше, тогда проектировать БД станет легче.

2. Запрос, который выведет авторов вместе с книгами.

Дело в том, что из-за реляционности БД, мы не можем получать коллекции, мы можем получать только строки. При таком раскладе, получение всех книг авторов мы должны разбить на два этапа:

  1. Получение авторов
  2. Получение книг для каждого автора

В данной ситуации на пользу приходит жадная загрузка, которая избавляет нас от антипаттерна N+1. Во многих фреймворках и ORM это идет из коробки:

//пример из ORM Eloquent, входящей в Laravel:
$author = \App\Author::with('books')->get();

Данный код в Laravel сделает 2 запроса в БД: 1. SELECT * FROM authors 2. SELECT * FROM books WHERE author_id IN (*ID авторов выше*) А затем совместит это в единую коллекцию.

READ ALSO
Сохранение файла в корень

Сохранение файла в корень

Пишу экстеншен для одной игрыОбычная ддл-ка в виде логера

179
Работа с QTimer, QThread и ProgressBar

Работа с QTimer, QThread и ProgressBar

Хочется выполнить вычисления в отдельном от Ui потоке без всяких сигналовМетод, выполняющий вычисления — это приватный слот главного окна

160
Работа с массивом строк

Работа с массивом строк

У меня есть массив строк:

181