5

我有一张看起来像这样的桌子

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它的NUM_SOLD值高于任何一个Apple值,所以它在Orange和之间排序Apple

这个 Apple and Pear 示例是我无法正常工作的。

4

4 回答 4

20
ORDER BY GREATEST(num_sold, num_views)

(参见MySQL 5.6 参考手册GREATEST(value1,value2,...)的第 12.3.2 节“比较函数和运算符”。)

于 2012-08-27T19:46:34.153 回答
4
order by
case when num_sold>num_views 
     then num_sold 
     else num_views 
end
于 2012-08-27T19:50:46.557 回答
4

正如其他用户所提到的,使用 GREATEST 功能是最合适的。但是,我要补充一点,如果您的列默认为 NULL 或可能包含 NULL 值,您可能需要将您的值合并为零。

这是因为GREATEST 如果传递的任何值为 NULLmysql best() docs)将返回 NULL,因此通过将任一列中具有 NULL 值的所有那些推到降序的底部来影响您的 ORDER BY 子句。

如果您的计数默认为零,那么它会很好,但如果它们默认为空,或者您需要此方法用于具有空值的任何其他表,那么这将是必需的。在处理通常具有 NULL 默认值的日期时,我发现了这一点。

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

注意:我没有足够的积分将其放在评论中,但我认为它对于答案来说足够有价值。

于 2016-01-14T12:33:03.130 回答
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
于 2012-08-27T19:49:39.190 回答