我在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%";
你有更好的解决方案吗?
答案 0 :(得分:3)
此模型称为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'
), ':')
答案 1 :(得分:2)
第二个查询不能使用索引。
您没有在问题中明确表示您是否能够对架构进行更改,但是如果可能的话,您应该尝试更改它。要在MySQL中存储heirarchical数据,我建议您先Models for hierarchical data 查看演示文稿Bill Karwin。
您可能还希望通过Hierarchical queries in MySQL阅读系列Quassnoi。