Ваш дизайн базы данных неверен. books.author
должно быть INT
и содержать внешний ключ для author.id
. Таблица author
должна содержать name VARCHAR(255)
(или два столбца, ссылающихся на author_name
, я до сих пор не уверен, есть ли у вас два автора или вы разделили имя на 2 записи).
Так что правильный дизайн будет:
BOOKS (
id INT,
book_title VARCHAR(255),
author INT, -- only if each book has just one author
PRIMARY KEY (id)
)
AUTHOR (
id INT,
name VARCHAR(255),
first_name_id INT, -- If you want to split names into more columns
PRIMARY KEY (id)
)
-- If you need more authors for one book
-- you maybe should keep original (primary) author id
BOOK_AUTHOR (
book_id INT,
author_id INT,
PRIMARY KEY (book_id, author_id)
);
Чем вы можете выбрать данные с помощью:
SELECT BOOKS.id, BOOKS.book_title, AUTHOR.name AS author
FROM BOOKS
-- Study difference between left and inner joins
INNER JOIN AUTHOR on AUTHOR.id = BOOKS.author
А если вам нужно больше авторов для одной книги:
SELECT BOOKS.id, BOOKS.book_title, AUTHOR.name AS author
FROM BOOKS
LEFT JOIN BOOK_AUTHOR on BOOK_AUTHOR.book_id = BOOKS.id
LEFT JOIN AUTHOR on AUTHOR.id = BOOK_AUTHOR.author_id
И вам может потребоваться вывести авторов как Wolfgang Goethe; Oscar Wilde
, чем вы можете использовать GROUP_CONCAT
:
SELECT BOOKS.id, BOOKS.book_title,
GROUP_CONCAT( AUTHOR.name SEPARATOR '; ') AS author
FROM BOOKS
LEFT JOIN BOOK_AUTHOR on BOOK_AUTHOR.book_id = BOOKS.id
LEFT JOIN AUTHOR on AUTHOR.id = BOOK_AUTHOR.author_id
GROUP BY BOOKS.id