kooler62
@kooler62
Студент

Как реализовать связь многие ко многим на сайте?

Нужно вывести 10 постов их теги и категории (категорий у каждого поста от одной и более).
Как я понимаю тут необходимо использовать связь "многие ко многим". Следовательно были созданы следующие таблицы:
posts
id, title, text

categories
id, category

tags
id, tag

post_category
post_id, cat_id

post_tag
post_id, tag_id

Пробовал делать через LEFT JOIN, возникла проблема: при выдаче, поста с 3-мя тегами он занимал 3 строки результата, то есть если ограничение в 10 записей(LIMIT 10) остается выдать максимум 7 постов, если у них будет по 1 тегу.
Подскажите как решить данную проблему, возможно циклами в SQL?,ее реализация есть на Wordpress,однако мои поиски и скудные познания ООП не дали результатов.

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cat` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `post_cat` (
  `post_id` int(11) NOT NULL,
  `cat_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `post_tag` (
  `post_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tag` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  • Вопрос задан
  • 305 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Проще всего в клиенте дополнительными запросами в цикле, но если хотите именно в SQL:
SELECT `p`.`title`, `p`.`text`, `t`.`tag`
    FROM (
        SELECT `title` FROM `posts` WHERE ... LIMIT 10
    ) AS `p`
    LEFT JOIN `post_tag` AS `pt` ON `pt`.`post_id` = `p`.`id`
    LEFT JOIN `tags` AS `t` ON `t`.`id` = `pt`.`tag_id`
    ORDER BY `p`.`title`, `t`.`tag`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ColdSpirit
Мне кажется вложенными запросами все просто решается, я обычно делаю через left outer join.
Выложите, пожалуйста, БД для теста, ваш select и пример того, что нужно получить
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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