2013-04-10 65 views
-2

我有以下表中的条目MySQL不正确排序

+--------------------------------------------+----------+ 
| menu_entry         | position | 
+--------------------------------------------+----------+ 
| ADMINISTRATION::USERMANAGEMENT::USER  |  2 | 
| DEMO::CHART::EXAMPLE      |  1 | 
| PROJMGMT::PROJSTRG::LOP     |  2 | 
| ADMINISTRATION::USERMANAGEMENT::RIGHTSMMGT |  1 | 
| PROJMGMT::PROJSTRG::MEETINGS    |  1 | 
| DEMO::GRID::CELLEDIT      |  1 | 
| DEMO::GRID::ROWEDIT      |  3 | 
| DEMO::DATAMGMT::GROUPING     |  1 | 
| DEVELOPER::APPS::ADDAPP     |  2 | 
| DEVELOPER::APPS::APPTEST     |  1 | 
| DEMO::GRID::LOCKINGDEMO     |  4 | 
| DEMO::GRID::FILTERDEMO      |  2 | 
+--------------------------------------------+----------+ 

我想menu_entry第一和第二位置被订购。我这样做与以下声明

select menu_entry,position from app_names order by menu_entry, position; 

但它只按menu_entry排序,而不是按位置排序。 这是我发言的回报:

+--------------------------------------------+----------+ 
| menu_entry         | position | 
+--------------------------------------------+----------+ 
| ADMINISTRATION::USERMANAGEMENT::RIGHTSMMGT |  1 | 
| ADMINISTRATION::USERMANAGEMENT::USER  |  2 | 
| DEMO::CHART::EXAMPLE      |  1 | 
| DEMO::DATAMGMT::GROUPING     |  1 | 
| DEMO::GRID::CELLEDIT      |  1 | 
| DEMO::GRID::FILTERDEMO      |  2 | 
| DEMO::GRID::LOCKINGDEMO     |  4 | 
| DEMO::GRID::ROWEDIT      |  3 | 
| DEVELOPER::APPS::ADDAPP     |  2 | 
| DEVELOPER::APPS::APPTEST     |  1 | 
| PROJMGMT::PROJSTRG::LOP     |  2 | 
| PROJMGMT::PROJSTRG::MEETINGS    |  1 | 
+--------------------------------------------+----------+ 

正如你所看到的,DEMO :: GRID :: ...未排序的权利。

+0

你为什么要存储分隔值? – 2013-04-10 13:48:02

+3

该查询似乎按预期工作。 – 99823 2013-04-10 13:49:09

+1

它被排序正确。 “L”在“R”之前。所以'LOCKINGDEMO'在'ROWEDIT'之前 – 2013-04-10 13:49:21

回答

4

你应该SUBSTRING_INDEX(menu_entry, '::', 1),提取字符串的一部分在第一::的左边或SUBSTRING_INDEX(menu_entry, '::', 2)这取决于你是什么后可能下令:

select menu_entry, position 
from app_names 
order by 
    SUBSTRING_INDEX(menu_entry, '::', 1), position; 

请参阅小提琴here