2016-08-05 4 views
0

私は、パスの列にインデックスを持つ以下の値を含むテーブルを持っています。パスで順序付けされた値を選択すると、インデックスが使用されますが、3番目の値を無視します。下記参照。私は何を注文を無視第4キャラクタ

を取得しています:私は取得する必要があります

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

イマジンあなたが唯一のパスに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列に置き、すべての列に対して1つの索引を作成します。皆さん、ありがとうございました。

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); 
関連する問題