SQL ORDER BY两列,以较高者为准

时间:2012-08-27 19:44:36

标签: mysql sql

我有一张看起来像这样的表

ITEM_NAME     | NUM_SOLD | NUM_VIEWS
Apple         |       50 |        75
Orange        |       40 |        85
Pear          |       80 |        70
Cherry        |       15 |        60

我想根据最后两列 中最高的数字对此进行排序。

所以上面的表格会这样排序:

ITEM_NAME     | NUM_SOLD | NUM_VIEWS
Orange        |       40 |        85
Pear          |       80 |        70
Apple         |       50 |        75
Cherry        |       15 |        60

您可以看到,根据我打入的数字,它们大多按NUM_VIEWS排序,但因为Pear的{​​{1}}值高于NUM_SOLD的值Apple的值,它在OrangeApple之间排序。

这个Apple和Pear的例子是我无法正常工作的。

4 个答案:

答案 0 :(得分:18)

答案 1 :(得分:4)

order by
case when num_sold>num_views 
     then num_sold 
     else num_views 
end

答案 2 :(得分:3)

正如其他用户所提到的,使用GREATEST功能是最合适的。我想补充一点,如果你的列默认为NULL或者可能包含NULL值,你可能需要COALESCE(mysql coalesce() docs)你的值为零。

这是因为如果传递的任何值为NULL GREATEST将返回NULL mysql greatest() docs),因此通过将任何列中包含NULL值的所有值推送到你的降序的底部。

如果您的计数具有默认值,那么它将没有问题,但如果它们默认为空,或者您需要此方法用于任何其他具有空值的表,那么这将是必需的。在使用通常具有NULL默认值的日期时,它让我感到很沮丧。

ORDER BY GREATEST(
    COALESCE(NUM_SOLD, 0),  # returns the column value or zero if null
    COALESCE(NUM_VIEWS, 0)
) 

注意:我没有足够的积分将其添加到评论中,但我认为这对于回答非常有价值。

答案 3 :(得分:0)

我通常会使用IF语句

IF @a > @b
BEGIN
  SELECT Col1, Col2, ... FROM Table1 Where... ORDER BY Col1
END
ELSE
BEGIN
  SELECT Col1, Col2, ... FROM Table1 Where... ORDER BY Col2
END