@ex3xeng

Как объединить несколько таблиц?

CREATE TABLE IF NOT EXISTS `prefix_categories` (
      `cat_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(255) NOT NULL,
      `slug` varchar(255) NOT NULL,
      `parent_id` int(11) unsigned NOT NULL DEFAULT '0',
      `num_sort` int(11) unsigned DEFAULT NULL,
      PRIMARY KEY (`cat_id`),
      UNIQUE KEY `slug` (`slug`),
      UNIQUE KEY `num_sort` (`num_sort`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    
    CREATE TABLE IF NOT EXISTS `prefix_link` (
      `link_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(255) NOT NULL,
      `slug` varchar(255) NOT NULL,
      `parent_id` int(11) unsigned NOT NULL DEFAULT '0',
      `num_sort` int(11) unsigned DEFAULT NULL,
      PRIMARY KEY (`link_id`),
      UNIQUE KEY `slug` (`slug`,`num_sort`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    
    CREATE TABLE IF NOT EXISTS `prefix_menu` (
      `menu_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `slug` varchar(255) NOT NULL,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`menu_id`),
      UNIQUE KEY `slug` (`slug`,`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    
    CREATE TABLE IF NOT EXISTS `prefix_pages` (
      `page_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(255) NOT NULL,
      `slug` varchar(255) NOT NULL,
      `parent_id` int(11) unsigned NOT NULL,
      `num_sort` int(11) unsigned DEFAULT NULL,
      PRIMARY KEY (`page_id`),
      UNIQUE KEY `slug` (`slug`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `prefix_menu` (
  `menu_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `slug` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`menu_id`),
  UNIQUE KEY `slug` (`slug`,`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `prefix_menu` (`menu_id`, `slug`, `name`) VALUES (1, 'main', 'главное');


Доброго времени суток! Выше привел созданную мной БД
Подскажите как реализовать меню на основе этих таблиц?

есть категории/страницы/ссылки разумеется поля у них тоже будут добавляться но четыре стандартных все же будут, хотелось бы не просто склеить их а вывести иерархию к примеру:

категория
--ссылка
----категория
--страница
ссылка
--категория
----страница
------ссылка
----страница

как реализовать задуманное?
Для начала архитектуру БД и сам запрос, можно ли это сделать одним запросом?

Подскажите актуальный запрос к БД, в идеале хотелось бы делать выборку по prefix_menu.slug
  • Вопрос задан
  • 268 просмотров
Решения вопроса 1
@CodeDes3D
Объединяют примерно так:
SELECT 'pc' table_name, * FROM prefix_categories 
UNION ALL
SELECT 'pl' table_name, * FROM prefix_link 
UNION ALL
SELECT 'pm1' table_name, *, 0 parent_id, NULL num_sort FROM prefix_menu
UNION ALL
SELECT 'pp' table_name, * FROM prefix_pages 
UNION ALL
SELECT 'pm2' table_name, *, 0 parent_id, NULL num_sort FROM prefix_menu;
Потом можно использовать это как подзапрос, по которому и создавать дерево. Но это далеко не оптимальный вариант
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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