我有一个包含以下值的表,在path列上有一个索引。当我选择按路径排序的值时,它使用索引,但忽略超过第三个的任何数字。见下文。
我得到的是什么:
category_id name path
1091 Bagels and Donuts 114.1091 (1 is ignored)
1092 Barbecue 114.1092 (2 is ignored)
115 Afghan Restaurant 114.113
1140 International 114.1140 (0 is ignored)
116 African Restaurant 114.116
117 Ethiopian Restaurant 114.116.117
118 American Restaurant 114.118
119 New American Restaurant 114.118.119
120 Asian Restaurant 114.120
我应该得到什么:
category_id name path
115 Afghan Restaurant 114.113
116 African Restaurant 114.116
117 Ethiopian Restaurant 114.116.117
118 American Restaurant 114.118
119 New American Restaurant 114.118.119
120 Asian Restaurant 114.120
1091 Bagels and Donuts 114.1091
1092 Barbecue 114.1092
1140 International 114.1140
有什么想法吗?
答案 0 :(得分:0)
想象你在路径中只有3个部分:
The new Color
想象一下,这不是IP,否则是一种更简单的方法。
答案 1 :(得分:0)
这是我的最终解决方案。将每个级别放入其自己的INT列,然后为所有列创建一个索引。谢谢大家的好意见。
DELIMITER $$
DROP FUNCTION IF EXISTS SPLIT_STR; $$
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');$$
DROP FUNCTION IF EXISTS GetLevel; $$
CREATE FUNCTION GetLevel (path VARCHAR, LevelN INT) RETURNS VARCHAR(1024)
DETERMINISTIC
BEGIN
DECLARE str VARCHAR(255);
SET str = SPLIT_STR(path,".",levelN);
IF str='' THEN
RETURN NULL;
END IF;
RETURN str;
END $$
DELIMITER ;
UPDATE categories SET level1 = GetLevel(category_id, 1), level2 = GetLevel(category_id, 2), level3 = GetLevel(category_id, 3), level4 = GetLevel(category_id, 4), level5 = GetLevel(category_id, 5);