2012-04-21 46 views
0

排序VARCHAR字段试图排序如下TEAM_TOTAL列说明对于MySQL数据库

MATCHID  TEAM_TOTAL   
---------- ----------------- 
573   Total 112  
573   Total 2 for 115 
574   Total 9 for 97 
574   Total 2 for 100 
575   Total 9 for 129 
575   Total 9 for 101 
576   Total 4 for 191 
576   Total 9 for 160 
577   Total 8 for 157 
577   Total 7 for 137 
578   Total 6 for 193 
578   Total 119 

但问题是TEAM_TOTAL为varchar,有没有与查询的方式独自我可以在排序倒序结果。 那边还有一段文字。我跑出去的想法,让这件事

结果应该beeen像下面的结果集

MATCHID  TEAM_TOTAL   
    ---------- ----------------- 
    578   Total 6 for 193 
    576   Total 4 for 191 
    576   Total 9 for 160 
    577   Total 8 for 157 
    577   Total 7 for 137 
    575   Total 9 for 129 
    578   Total 119 
    573   Total 2 for 115 
    573   Total 112 
    575   Total 9 for 101 
    574   Total 2 for 100 
    574   Total 9 for 97 
+0

尝试'SELECT * FROM表名ORDER BY TEAM_TOTAL' – 2012-04-21 08:11:02

+0

如何此列'Team_TOTAL'从您的查询填充,您可以发布它。 – 2012-04-21 08:11:03

+0

@FahimParkar,'Team_TOTAL'是'varchar'列,即会被alphapitacally排序,但OP希望它通过在数字后的对keywoard进行排序。 – 2012-04-21 08:12:18

回答

2

试试这个:

select * from t 
order by substring(
    team_total, locate('for', team_total) + 
     if(locate('for', team_total) > 0, 4, 7))+0 desc 

小提琴here

+1

非常感谢你这真的很棒,你是SQL GURU – gmhk 2012-04-21 08:52:56

0

尝试提取(最后一个空格之后的字符串)的整数

-- 'Total 112' - extracts 112 
SELECT SUBSTRING('Total 112', LENGTH('Total 112') - LOCATE(' ', REVERSE('Total 112'))); 

-- 'Total 6 for 193' - extracts 193 
SELECT SUBSTRING('Total 6 for 193', LENGTH('Total 6 for 193') - LOCATE(' ', REVERSE('Total 6 for 193'))); 

现在,您可以将该字符串转换为数字,然后按顺序排序。

SELECT * FROM teams 
ORDER BY 
CAST(SUBSTRING(TEAM_TOTAL, LENGTH(TEAM_TOTAL) - LOCATE(' ', REVERSE(TEAM_TOTAL))) AS INT) DESC