Как отобразить несколько значений, отфильтрованных из двух столбцов - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть домашнее задание, где я должен выбрать данные из двух таблиц (книга и автор).Книги имеют двух авторов, и мне нужно отобразить результат с названием книги и авторами, разделенными запятой.

Я пробовал сам, но получил ошибки.

Схема SQL:

CREATE TABLE IF NOT EXISTS `author` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(128),
  `surname` VARCHAR(128),
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8mb4 ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `book` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(128),
  `author_id` INT NOT NULL,
  `author_id_2` INT NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8mb4 ENGINE=InnoDB;

Запрос SQL:

INSERT INTO `author` (`name`, `surname`) VALUES ("William", "Shakespeare");
INSERT INTO `author` (`name`, `surname`) VALUES ("Agatha", "Christie");
INSERT INTO `author` (`name`, `surname`) VALUES ("J. K", "Rowling");
INSERT INTO `author` (`name`, `surname`) VALUES ("George", "Orwell");
INSERT INTO `book` (`title`, `author_id`, `author_id_2`) VALUES ("Hamlet", 1, 2);
INSERT INTO `book` (`title`, `author_id`, `author_id_2`) VALUES ("Macbeth", 1, 3);
INSERT INTO `book` (`title`, `author_id`, `author_id_2`) VALUES ("Murder on the Orient Express", 2, 3);
INSERT INTO `book` (`title`, `author_id`, `author_id_2`) VALUES ("The Secret of Chimneys", 2, 1);
INSERT INTO `book` (`title`, `author_id`, `author_id_2`) VALUES ("1984", 3, 1);
INSERT INTO `book` (`title`, `author_id`, `author_id_2`) VALUES ("Animal Farm", 3, 2);

Запрос:

SELECT 
    b.title Pavadinimas, 
    concat(concat(a1.name, ' ', a1.surname), ', ', concat(a2.name, ' ', a2.surname) Autoriai 
FROM book b 
INNER JOIN author a1 WHERE book.author_id=a1.id 
INNER JOIN author a2 WHERE book.author_id_2=a2.id;

Результат должен быть:

Hamlet | William Shakespeare, Agatha Christie

1 Ответ

0 голосов
/ 02 апреля 2019

Вам потребуется дважды объединить таблицу книг с таблицей авторов, например:

SELECT 
    b.title, 
    CONCAT(a1.name, ' ', a1.surname, ', ', a2.name, ' ', a2.surname)  authors
FROM book b 
INNER JOIN author a1 ON b.author_id = a1.id
INNER JOIN author a2 ON b.author_id_2 = a2.id

Эта демонстрация на DB Fiddle с вашими примерами возврата данных:

| title                        | authors                              |
| ---------------------------- | ------------------------------------ |
| Hamlet                       | William Shakespeare, Agatha Christie |
| Macbeth                      | William Shakespeare, J. K Rowling    |
| Murder on the Orient Express | Agatha Christie, J. K Rowling        |
| The Secret of Chimneys       | Agatha Christie, William Shakespeare |
| 1984                         | J. K Rowling, William Shakespeare    |
| Animal Farm                  | J. K Rowling, Agatha Christie        |

Примечание: если у вас есть книги только с одним автором, вы можете использовать LEFT JOIN вместо INNER JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...