Пользовательская переменная не обновляется в подзапросе - PullRequest
0 голосов
/ 22 февраля 2019

Я использую оператор RECURSIVE для MariaDB, чтобы получить путь к категории продукта, когда я знаю уникальный идентификатор категории продукта, из таблицы ссылок на себя.

Это работает:

WITH RECURSIVE categories AS (
        SELECT * FROM tbl_eav_categories tec2 WHERE tec2.category_id = 1023
        UNION
        SELECT tec3.* FROM tbl_eav_categories tec3, categories AS c WHERE tec3.category_id = c.parent_category_id
        )
        SELECT GROUP_CONCAT(CONCAT(category_default_label,' [',category_id,']') ORDER BY category_id ASC SEPARATOR ' >> ') FROM categories

И возвращает:

Consumables [7] >> Catering Equipment and Supplies [95] >> Tea Bags [1023]

Отлично.

Но теперь мне нужно перечислить все идентификаторы категории и во втором столбце их пути.Я подумал, что это просто вопрос SELECT для таблицы первичной таблицы категорий ('tbl_eav_categories') и отбрасывание вышеуказанного запроса в качестве столбца подзапроса.Примерно так:

SELECT
    @CatID := category_id AS 'cat_id',
    (
    WITH RECURSIVE categories AS (
        SELECT * FROM tbl_eav_categories tec2 WHERE tec2.category_id = @CatID
        UNION
        SELECT tec3.* FROM tbl_eav_categories tec3, categories AS c WHERE tec3.category_id = c.parent_category_id
        )
        SELECT GROUP_CONCAT(CONCAT(category_default_label,' [',category_id,']') ORDER BY category_id ASC SEPARATOR ' >> ') FROM categories
    ) 'categorypath'
FROM tbl_eav_categories;

Однако все, что я получаю, это:

cat_id  categorypath
1   Bearings [1]
2   Bearings [1]
3   Bearings [1]
4   Bearings [1]
5   Bearings [1]
6   Bearings [1]
...

(так до конца всего набора результатов).

После некоторого исследованияЯ верю, что это как-то связано с вычисляемой переменной @CatID до ее назначения, но я не могу понять, как ее обойти.

Я пытался следовать указаниям Бена Инглиша здесь: Пользовательская переменная в подзапросе MySQL , но это сбивает меня с толку: (

Пожалуйста, помогите!:)

1 Ответ

0 голосов
/ 22 февраля 2019

Я полагаю, что нашел ответ, включив все сканирование таблицы в фактическое CTE:

WITH RECURSIVE category_path (id, title, path) AS
(
  SELECT category_id, category_default_label, category_default_label path FROM tbl_eav_categories WHERE parent_category_id IS NULL
  UNION ALL
  SELECT c.category_id, c.category_default_label, CONCAT(cp.path, ' [',c.parent_category_id, '] >> ', c.category_default_label) FROM category_path cp JOIN tbl_eav_categories c ON cp.id = c.parent_category_id
)
SELECT id,path FROM category_path
ORDER BY path;
...