asc和desc的排序没有给出正确的结果

时间:2016-06-12 08:49:48

标签: mysql max sql-order-by

我在查询中遇到问题。

id ,voteup , votedown

1  , 12     ,  7
2  ,  6     , 1 
3  ,  4     , 9 
4  ,  0     , 6 

我的查询是

 SELECT cm.id ,cm.voteup,cm.votedown  FROM Table1 cm  
 INNER JOIN ( select id ,MAX(voteup - votedown ) as maxe 
             from Table1 where voteup - votedown >= 5  group by id  ) tt
 on cm.id = tt.id
 ORDER BY cm.voteup DESC,cm.votedown asc,cm.id  limit 1

我得到了这个结果

  id, voteup , votedown
   1, 12     ,  7

我想首先选择voteup - votedown >= 5的最大结果 如果两个结果有相同的结果,我想订购一个投票少的人

我希望得到这个结果

 id , voteup , votedown
  2 ,  6     , 1         

感谢。

这是sqlfiddle Demo

我试图像那样改变列的顺序

  ORDER BY cm.votedown asc ,cm.voteup DESC limit 1

但如果我有这样的值

,这也会给我错误的结果
   id ,voteup , votedown

   1  , 6     ,  0
   2  , 9     , 2 
   3  ,  4     , 9 
   4  ,  0     , 6 

给出了

 1,  6 , 0

但我想要

2 , 9 , 2    > which is max (9-2)
最后一次尝试

fiddle

1 个答案:

答案 0 :(得分:1)

您必须首先放置字段maxe DESC,然后在cm.votedown asc子句中放置ORDER BY 第一个

SELECT cm.id ,cm.voteup,cm.votedown  FROM Table1 cm  
INNER JOIN ( 
   select id, MAX(voteup - votedown ) as maxe 
   from Table1 
   where voteup - votedown >= 5  
   group by id  
) tt on cm.id = tt.id
ORDER BY maxe DESC, cm.votedown asc, cm.voteup DESC, cm.id  limit 1

此查询将选择具有最大 voteup - votedown差异的记录。如果是tie,查询将返回具有最小 votedown值的记录。

Demo here