命令忽略第四个字符

时间:2016-08-05 03:26:32

标签: mysql innodb

我有一个包含以下值的表,在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

有什么想法吗?

2 个答案:

答案 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);