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

6

我有一个像这样的数据库:

|--------------------------------------------------------------------------|
| 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或Score3的最高评级人员,则执行上述查询将给出Joe Bloggs,尽管他的评级低于Bob Bobbing。

同样地,如果我想要Score1或Score2或Score4的最高评级人员,则仍需要先指定其中一个分数进行排序。我需要一种方法来组合所有指定的X列的结果,然后按组合分数“列”排序,接着按评级排序。


3
23列?我认为最好增加一张新表,其中包括分数编号和分数值。此外,“在Score1、Score2或Score4方面得分最高的人”不太容易准确理解。您能否添加一些所需结果的示例? - Alma Do
“Combining”列的含义不明确。在您提供的“Score2 OR Score3”的例子中,看起来Joe和Bob的分数是一样的,除了Bob的评级更高。这里的“combine”是否意味着“相加”?(因此,您需要使用SUM()函数来计算相关字段?)或者您可以先按“Rating”进行排序吗? - poundifdef
@poundifdef 正是,乔和鲍勃的Score2和Score3都是零,所以选择按评分排序。如果我先按评分排序,玛乔里的排名会最高,因为她的评分比其他人都高。我需要先考虑分数,然后再考虑评分。如果没有人在指定的分数列中得到零分,则必须考虑那些得到-10分的人,并从该组中选择评分最高的人。 - Stuart Pinfold
4个回答

11

你可能希望使用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()函数中即可。


这就是解决方案。我之前不知道GREATEST - 太好了,非常感谢! - Stuart Pinfold

1

根据您的评论,我认为您正在寻找GREATEST函数。

使用方法如下:

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

ORDER BY 1 表示按第一列排序。


0

请参考 Stack Overflow 上的 这个答案

您可以使用 (column1 + column2) 将列相加。

例如:

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

列的总和与相对排序有什么共同点? - Alma Do
我一定误解了原帖作者提出的问题,“合并两个或更多分数列”听起来像他想要将这些列相加。 - amaster
OP说他们想知道Score1或Score2或Score4的最高分。你的解决方案适用于AND情况。 - Mark Unsworth
请看我上面的评论。虽然这是一个旧帖子,但我认为我的误解问题的错误仍然有价值,因为知道不想要什么同样重要。 - amaster

-2
如果列中的数据是字符串,则在ORDER BY中使用IF()可能有效。例如,如果您有两列(例如Name_FirstName_Last),并且您想要按Name_First排序,如果Name_LastNULL,则按Name_Last排序,如果不是NULL,则:
SELECT * FROM MyTable ORDER BY IF(Name_Last IS NULL,Name_First,Name_Last);

从概念上讲,它是IF(expression1, expression2, expression3):如果expression1为真,则返回expression2,否则返回expression3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接