2011-03-07 75 views
1

我在我的表中有一个字段“星星”。mysql排序位

1 means ** 
2 means *** 
4 means **** 

现在他们可以像3意味着2.5和6意味着3.5星。它只是两个相邻的值,所以像5不能发生。 这与输出效果很好。现在的问题是分拣。现在我只是和场上的明星们分道扬。。显然,这并不正常工作,因为正确的顺序是这样的:

2.5stars, 3stars, 3.5stars 

但这些意味着:

3,2,6 

全面正确的排序是这样的:

1,3,2,6,4,12,8,24,16 

我有一个pagebrowser与限制和筛选一切,所以我不想选择所有行和手动排序。有没有办法在我的查询中直接进行这种排序?

编辑:

需要明确的是,这个来自按位..

00001 = ** 
00010 = *** 
00011 == 2.5* 
00100 = **** 
+6

为什么不把它作为一个整数存储?我看不出为什么你甚至想要做这样的事情? – ircmaxell 2011-03-07 14:39:55

+0

疯狂的想法,但为什么不只是解决问题的来源(奇怪的1 = 2星,2 = 3开始等设置),而不是使用一些模糊的排序“修复”。 – 2011-03-07 14:40:43

+0

这来自cms,不能真正改变它 – Flo 2011-03-07 14:42:59

回答

2

它不漂亮,但你可以给这个一杆。

SELECT x FROM y WHERE z 
ORDER BY 
CASE stars 
    WHEN 1 THEN 1 
    WHEN 3 THEN 2 
    WHEN 2 THEN 3 
    WHEN 6 THEN 4 
    WHEN 4 THEN 5 
    WHEN 12 THEN 6 
    WHEN 8 THEN 7 
    WHEN 24 THEN 8 
    WHEN 16 THEN 9 
    ELSE 10 
END CASE 
+0

绝对不漂亮,但我即将建议这一点。同时检查:http://dev.mysql.com/doc/refman/5.0/en/case-statement.html – 2011-03-07 15:01:07

+0

就像在评论中映射表的解决方案一样,这既不好也不灵活。如果用户在后端添加更多元素,则需要在此处添加更多行以进行排序。 – Flo 2011-03-07 15:10:56

+0

+1甚至不知道SQL有CASE。 – Czechnology 2011-03-07 15:14:15