za4me
@za4me
Человек

Реализация связи many-to-many?

Добрый день, подскажите пожалуйста, или поделитесь мануалом как сделать вот такой запрос:

Имеем таблицу книги с схемой "booksid, title, price"
Таблицу автора "authorid, phone"
И третью таблицу через которая содержит "booksid, authorid"

Каким должен быть запрос, что-бы при выводе всех книг, к каждой книге отображался ее автор или авторы.

Большое спасибо за помощь.
  • Вопрос задан
  • 7619 просмотров
Пригласить эксперта
Ответы на вопрос 5
@heartdevil
плыву как воздушный шарик
Привет.

Это просто. Вот смотрите, у вас есть перекрестная таблица с bookid, authorid. Грубо говоря, по обе стороны от этой таблицы у вас будет соединение с таблицей - книги, и с таблицей - авторы.

То есть общий вид запроса:

Условно
SELECT * FROM books
INNER JOIN books_authors ON books.id = books_authors.booksid
INNER JOIN authors ON books_authors.authorid = authors.id
Ответ написан
DVamp1r3
@DVamp1r3
Java/PHP программист
Почитайте про JOIN, либо в два запроса (получаем книгу, получаем авторов для книги -> генерируем таблицу)
Ответ написан
Комментировать
MonsterMan
@MonsterMan
Я на всякий случай подробнее напишу, т. к. сразу осознать бывает тяжело. Вот например есть таблицы, что вы описали (я чуть переименовал)
CREATE TABLE IF NOT EXISTS `authors` (
  `authorid` int(11) NOT NULL AUTO_INCREMENT,
  `phone` varchar(100) NOT NULL,
  PRIMARY KEY (`authorid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `authors` (`authorid`, `phone`) VALUES
(1, '123456789'),
(2, '987654321');

CREATE TABLE IF NOT EXISTS `books` (
  `booksid` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `price` float NOT NULL,
  PRIMARY KEY (`booksid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

INSERT INTO `books` (`booksid`, `title`, `price`) VALUES
(1, 'Название1', 10),
(2, 'Название2', 20);

CREATE TABLE IF NOT EXISTS `third` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `authorid` varchar(100) NOT NULL,
  `booksid` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `third` (`id`, `authorid`, `booksid`) VALUES
(1, '1', '2'),
(2, '2', '1');

В случае такого запроса, вы получите объединённые таблицы и уже сможете выбирать из них, что угодно.
SELECT * FROM books
INNER JOIN third ON books.booksid = third.booksid
INNER JOIN authors ON third.authorid = authors.authorid

Наверняка, гуру могут посоветовать что-то изящнее. Мне кажется тут many-to-many не очень оправдано. Поправьте, если что.
Ответ написан
@AlikDex
3 дня тестов привели к такому. Смотрите внизу. Схема ровно такая же как у вас.
Как грамотно связать посты и категории (товар и категории, если угодно)?
Запросы, что предложили товарищи в теме тут будут очень медленные при большом количестве книг.

На некотором этапе может статься так, что проще будет сделать 2 запроса на пост, чем вот такое городить.
Ответ написан
Комментировать
customtema
@customtema
arint.ru
В 2 запроса будет работать немного быстрее, и можно кешировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы