поиск по дереву категорий MySQL - PullRequest
3 голосов
/ 11 января 2011

У меня есть следующая схема на MySQL 5.1

CREATE TABLE  `mytest` (
  `category` varchar(32) ,
  `item_name` varchar(255)
  KEY `key1` (`category`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

, столбец категории заполняется примерно так:

[:parent_parent_cat_id][:parent_cat_id][:leaf_cat_id]

10000200003000

, если вы можете искать во всех нижележащих категориях: parent_parent_category_id

SELECT * FROM mytest WHERE category LIKE "10000%";

он использует индекс key1;

, но как использовать индекс, когда я хочу искать: parent_cat_id?

SELECT * FROM mytest WHERE category LIKE "%20000%";

У вас есть лучшие решения?

Ответы [ 2 ]

3 голосов
/ 11 января 2011

Эта модель называется materialized path.

Вам просто нужно categories в отдельной таблице и сделать items ссылкой на эту таблицу, а не на путь:

SELECT  i.*
FROM    categories c
JOIN    items i
ON      i.category = c.id
WHERE   c.path BETWEEN
        (
        SELECT  path
        FROM    categories ci
        WHERE   ci.id = '20000'
        )
        AND
        CONCAT(
        (
        SELECT  path
        FROM    categories ci
        WHERE   ci.id = '20000'
        ), ':')
2 голосов
/ 11 января 2011

Второй запрос не может использовать индекс.

Вы не указали в своем вопросе, можете ли вы внести изменения в схему, но вы должны попытаться изменить ее, если это возможно. Для хранения иерархических данных в MySQL я предлагаю вам сначала взглянуть на презентацию Модели для иерархических данных по Билл Карвин .

Вы также можете прочитать серию Иерархические запросы в MySQL по Quassnoi .

...