Mysql рекурсивные объединения - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть таблица "категория" и таблица "продукты".Категория имеет 4 уровня глубины .

Категория таблицы имеет внешний ключ category_fk, который ссылается на ту же таблицу, и одно поле с частью URL modrewrite.Это поле называется mr.

Продукты имеют внешний ключ category_fk, который ссылается на категорию таблицы

Продукты имеют только категории на последнем уровне, но глубина последней категории отсутствует.t всегда 4. Возможно, что категории имеют только 2 или 3 уровня.

Мой вопрос: возможно ли выполнить запрос, который возвращает все объединенные mr поля, подобные этому cat1/cat2/cat3, или всеструктура без записи всех левых соединений и псевдонимов категории таблицы, например "as c1", "as c2"?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

На основе этой структуры

create table category (id int, mr varchar(10), category_fk int);
create table products (id int, name varchar(100), category_fk int);

insert category values
(1, 'cat1', null),(2, 'cat2', 1),(3, 'cat3', 2),(4, 'cat4', 3),
(5, 'cat5', null),(6, 'cat6', null),(7, 'cat7', 5);

insert products values
(1, 'product A', 4),
(2, 'product B', 3),
(3, 'product C', 5),
(4, 'product D', 7),
(5, 'product E', 7),
(6, 'product F', 1);

Запрос

select p.name, substr(concat(
  ifnull(concat('/',c4.mr),''),
  ifnull(concat('/',c3.mr),''),
  ifnull(concat('/',c2.mr),''),
  ifnull(concat('/',c1.mr),'')),2)
from products p
left join category c1 on p.category_fk = c1.id
left join category c2 on c1.category_fk = c2.id
left join category c3 on c2.category_fk = c3.id
left join category c4 on c3.category_fk = c4.id

Примечания

  • подстрок первый /
  • concat в обратном порядке к соединениям (родительский сначала)
  • concat '/' и null возвращает null, который заменяется на '', в противном случае он делает основной concat NULL
0 голосов
/ 07 апреля 2011

Это невозможно с описанной выше структурой таблицы, но возможно, если вы примете модель Nested Set .Статья Управление иерархическими данными в MySQL описывает это (помимо других моделей).

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