2010-09-05 51 views
1

我得到了双方评级评级项目,并使用ORDER BY键通过积极命令他们,但是有一个示例表:MySQL的ORDER BY不是订购

//(item)-(pos)-(neg): 
item 1 - 50 - 200 
item 2 - 24 - 0 
item 3 - 15 - 12 

但第1项是真正的评价比少别人,我会如何解决这个问题?

回答

2

你可以做ORDER BY pos - neg DESC,但将是缓慢的,因为它不能使用索引。

您可以通过在表中明确存储pos - neg的值来规范化数据库,以便您可以对其进行索引以提高性能。通常非规范化被认为是一件坏事,应该避免,但如果它需要改进的性能,那么这是一个可接受的方法。

+0

+1强调性能是使用非规范化作为策略的唯一正当理由。 (我转发了我的评论,因为之前措辞不佳。) – BoltClock 2010-09-06 04:01:30

2

您可以通过从pos减去neg找到净分数,然后按该净分数排序。计算它,然后给它一个别名,我们把它叫做net

mysql> SELECT item, pos, neg, (pos - neg) AS net 
    -> FROM table 
    -> ORDER BY net DESC; 
+------+-----+-----+------+ 
| item | pos | neg | net | 
+------+-----+-----+------+ 
| 2 | 24 | 0 | 24 | 
| 3 | 15 | 12 | 3 | 
| 1 | 50 | 200 | -150 | 
+------+-----+-----+------+ 
3 rows in set (0.00 sec) 
0

是的,你可以按顺序使用数学。

ORDER BY pos-neg DESC

但是确保pos和neg不是UNSIGNED!因为当他们试图消极时,你会以有史以来最大的结果结束;)