2016-08-05 4 views
0

나는 경로 열에 인덱스와 함께 다음과 같은 값을 포함하는 테이블을 가지고 있습니다. 경로별로 정렬 된 값을 선택하면 인덱스를 사용하지만 세 번째 숫자는 무시합니다. 아래를 참조하십시오.주문 무시로 인해 네 번째 문자

나는 점점 오전 무엇 :

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 

어떤 생각?

+1

색인이 예상대로 작동하지 않습니까? 현재 주문한 것이 내게 적합합니다. –

+0

@TimBiegeleisen 상단의 결과는 내가 얻는 결과이며 하단의 결과는 올바른 결과입니다 – thedeveloper3124

+1

문자열 정렬이 정확합니다. 귀하의 예상 숫자는 다른 숫자입니다. 그러나 그것은 여전히 ​​성취 가능하다. 당신의 두뇌를 다시 시도하십시오 : D – SIDU

답변

0

Imagin 당신은 경로의 3 개 부분이 있습니다

SELECT * FROM tab 
ORDER BY 
    substring_index(path, '.', 1) + 0, ## sort by 1st part 
    substring_index(substring_index(path, '.', 2), '.' , -1) + 0, ## sort by 2nd part 
    substring_index(path, '.', -1) + 0 ## sort by 3rd part 

을 그리고 이것은 그렇지 않으면, 그것을 할 수있는 더 간단한 방법 IP 아니다 상상해보십시오.

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); 
관련 문제