2012-05-01 75 views
4

我如何order by破折號?MySQL:如何通過( - )破折號

舉例來說,我有下面這些數據,

page_id url 
1   - a 
2   - b 
3   --- c 
4   --- d 
5   - e 
6   - f 
7   -- g 
8   -- h 

結果是我後,

page_id url 
1   - a 
2   - b 
5   - e 
6   - f 
7   -- g 
8   -- h 
3   --- c 
4   --- d 

如果我這樣做,

ORDER by x.url ASC 

我仍然得到這一點,

page_id url 
1   - a 
2   - b 
3   --- c 
4   --- d 
5   - e 
6   - f 
7   -- g 
8   -- h 

有什麼建議嗎?

編輯:

我實際的SQL,

SELECT 
    *, 
    IF(grandparentURL REGEXP '^[a-z0-9\-]+$', CONCAT('--- ', url), IF(parentURL REGEXP '^[a-z0-9\-]+$', CONCAT('-- ', url), CONCAT('- ', url))) AS url 
FROM 
(
    SELECT 
     p.page_id, 
     p.url, 
     p2.url AS parentURL, 
     p3.url AS grandparentURL 

    FROM page AS p 

    LEFT JOIN page AS p2 
    ON p.parent_id = p2.page_id AND p.page_id != p2.page_id 

    LEFT JOIN page AS p3 
    ON p2.parent_id = p3.page_id AND p2.page_id != p3.page_id 

    WHERE IF('5' REGEXP '^[0-9]+$', p.page_id != '5', p.page_id IS NOT NULL) 
    AND p.url != 'cms' 
) x 

ORDER by x.url ASC 
+2

似乎類似:MySQL的計數子串的情況下,則順序按...](http://stackoverflow.com/questions/5427467/mysql-count-instances-of-substring-then-order-通過)。 – Sampson

+2

你如何定義你的列?我根本沒有得到這個結果。我得到你想要的。看到這裏:http://sqlfiddle.com/#!2/51638/1 –

+0

@MikeRyan - 我不知道,請參閱我的編輯我的實際查詢。謝謝。 – laukok

回答

1

做多重命令通過...首先由所在的位置首先找到空格,然後按整個URL排序。由於common-b和-a將處於同一個分組中,因此它們的空間將它們保存在組「1」中......然後,整個URL將強制您的正確的 - a, - b, - c等等

ORDER BY INSTR('x.url', ' '), x.url 
+0

謝謝。這給了我一個更好的結果。 – laukok

1

第一空間的位置在字符串中試試這個

ORDER BY SUBSTRING_INDEX(url, ' '),url 

第一部分訂單

+1

不,它不應該,這就是爲什麼實際的URL是ORDER子句的第二部分。你也可以使用trim(替換(URL,' - ',''))作爲ORDER BY子句的第二部分 – Sparky

+0

@Sparky - 我剛剛試過但沒有運氣...... – laukok

+0

我得到這個錯誤'#1582 - 調用本地函數'SUBSTRING_INDEX''時參數數不正確# – laukok