我有一个这样的数据库:
|--------------------------------------------------------------------------|
| 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列的结果,然后按组合得分'列'排序,然后按评级排序。
答案 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_First
和Name_Last
),并且如果Name_First
为Name_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
。