SQL:将多个列合并为一个用于排序(仅限输出)

时间:2014-01-13 13:50:22

标签: mysql sql sorting

我有一个这样的数据库:

|--------------------------------------------------------------------------|
| NAME               |  SCORE1  |  SCORE2  |  SCORE3  |  SCORE4  |  RATING |
|--------------------------------------------------------------------------|
| Joe Bloggs         |  -50     |  0       |  -10     |  -30     |  67     |
| Bob Bobbing        |  -30     |  -10     |  0       |  -10     |  74     |
| Marjorie Doors     |  0       |  -10     |  -30     |  -50     |  88     |
| etc... ------------------------------------------------------------------|

我要做的是找到任何给定分数位置的最高等级名称。

如果只有一个得分位置,我会很好:

SELECT name FROM db ORDER BY Score2 DESC, Rating DESC LIMIT 1

...给了我得分最高的人,得分为2分。


我现在需要的是找到一种方法来组合两个或更多得分列(总共有23个),但仍然会返回给出评分最高的人。

例如,如果我想获得Score2 OR Score3评分最高的人,那么即使他的评分低于Bob Bobbing的评分,上面的查询也会给我Joe Bloggs。

同样,如果我想要得分最高的人获得Score1 OR Score2 OR Score4,我仍然需要指定其中一个分数来排序。我需要一种方法来组合指定的所有X列的结果,然后按组合得分'列'排序,然后按评级排序。

4 个答案:

答案 0 :(得分:6)

您可能想要使用GREATEST()功能:

With two or more arguments, returns the largest (maximum-valued) argument.

此代码段为您的示例中的score2和score3列执行了所需的操作:

SELECT name, GREATEST( score2, score3 ) AS max_score, rating
FROM db
ORDER BY max_score DESC , rating DESC

按组合分数排序,如果它们相等则按结果排序(从最高到最低)。

对于更多列,只需将它们作为参数添加到GREATEST()函数。

答案 1 :(得分:1)

根据评论中的信息,我认为您正在寻找的是GREATEST功能。

按如下方式使用:

SELECT GREATEST(Score1, Score2, Score3, ...) AS Score, Rating 
FROM db
ORDER BY 1, Rating 

ORDER BY 1表示第1列的订单。

答案 2 :(得分:0)

请参阅Stack Overflow上的this reference answer

您可以使用(column1 + column2)

将列添加到一起

For Instance:

SELECT name FROM db ORDER BY (SCORE1 + SCORE2 + SCORE3) DESC, Rating DESC LIMIT 1

答案 3 :(得分:-1)

如果列中的数据是字符串,则可以在IF()中使用ORDER BY。例如,如果您有两列(例如Name_FirstName_Last),并且如果Name_FirstName_Last,则想按NULL排序,按{ {1}}(如果不是Name_Last,则:

NULL

从概念上讲,它是SELECT * FROM MyTable ORDER BY IF(Name_Last IS NULL,Name_First,Name_Last); :如果IF(expression1, expression2, expression3)为true,则返回expression1,否则返回expression2