【问题标题】:mysql category tree searchmysql 类别树搜索
【发布时间】:2011-01-11 13:45:05
【问题描述】:

我在 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%";

你有更好的解决方案吗?

【问题讨论】:

    标签: mysql indexing tree sql-like varchar


    【解决方案1】:

    这个模型叫做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'
            ), ':')
    

    【讨论】:

    • 非常感谢。 item.path 比如 '/Path/To/Leaf' 可以吗? '到'的 id = '20000'
    • @ffff:不是item.path,而是category.path。是的,表格是OK
    • category.path BETWEEN '/Path/To' AND '/Path/To.' ?我需要学习更多的 SQL 技能...
    • @ffff:实际上,您总是需要提供尾随分隔符(以区分110),最好使用ASCII 中的数字后面的分隔符命令。那就是category.path BETWEEN 'Path:To:' AND 'Path:To::'
    • 好的,也许我得到了它,而不是行为:-)
    【解决方案2】:

    第二个查询不能使用索引。

    您没有在问题中明确说明您是否能够更改架构,但您应该尽可能尝试更改它。要在 MySQL 中存储分层数据,我建议您首先查看 Bill Karwin 的演示文稿 Models for hierarchical data

    您可能还想阅读Quassnoi 的系列Hierarchical queries in MySQL

    【讨论】:

    • 我认为索引是基于列创建的,不管你在哪里做的值都无关紧要
    • @Shakti Singh:是的,在几乎所有情况下都是如此。一个例外是 LIKE,它只能在字符串的开头是常量(不是通配符)时使用索引。
    • 非常感谢。但由于我的大脑不好,我无法得到它:-
    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多