@y0zek3

Как сделать такую базу данных в Mysql?

Нужно сделать базу данных в которой хранятся книги и авторы и сделать запрос чтобы вывело авторов, которые написали более 3 книг. У меня получилось сделать 2 таблицы.
Таблица authors
----+--------------+
| id | AuthorName   |
+----+--------------+
|  1 | John Smith   |
|  2 | Jane Doe     |
|  3 | Someone Else |
+----+--------------+


таблица books
+--------+-----------------------+----------+
| bookId | title                 | authorId |
+--------+-----------------------+----------+
|      1 | Secret of Everything  |        1 |
|      2 | Secret of Nothing     |        1 |
|      3 | Secret of Some Things |        1 |
|      4 | No More Secrets       |        1 |
|      5 | How to Tame Cats      |        2 |
|      6 | How to Tame Dogs      |        2 |
|      7 | Just a Book           |        3 |
+--------+-----------------------+----------+


мой запрос для показа авторов
mysql> SELECT  AuthorName, COUNT(authorId) as authorId
FROM books LEFT JOIN authors ON authorId = id
GROUP BY AuthorName
HAVING authorId >= 3;


Но как выяснилось, я должен сделать это задание не с 2 а с 3 таблицами (3ья возможно book_author_id), как я могу это сделать, помогите пожалуйста. Нужно использовать foreign/primary key.
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
B-Erolskiy
@B-Erolskiy
Junior PHP Developer
Все правильно: связь между таблицами должна быть М:М (многие ко многим), так как у одного автора может быть много книг, и у одной книги может быть много авторов. Вы же спроектировали БД, в которой у книги может быть только один автор.

БД будет примерно такой:

CREATE TABLE authors
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    author_name VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE books
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    book_title VARCHAR(100) NOT NULL
);

CREATE TABLE book_author_id
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    author_id INT NOT NULL,
    book_id INT NOT NULL,

    FOREIGN KEY (author_id) REFERENCES authors (id) ON DELETE CASCADE,
    FOREIGN KEY (book_id) REFERENCES books (id) ON DELETE CASCADE
);


И тогда выборка данных по вашему условию будет:

SELECT authors.author_name, COUNT(book_author_id.author_id) as count
FROM authors
LEFT JOIN book_author_id
    ON book_author_id.author_id= authors.id
LEFT JOIN books
    ON book_author_id.book_id= books.id
GROUP BY authors.author_name
HAVING COUNT(DISTINCT book_author_id.author_id) >= 3;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы