【问题标题】:SQL: Combine multiple columns into one for sorting (output only)SQL:将多列合并为一列进行排序(仅输出)
【发布时间】:2014-01-13 13:50:21
【问题描述】:

我有一个这样的数据库:

|--------------------------------------------------------------------------|
| 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

...给我评分最高且得分最高的人。


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

例如,如果我想要 Score2 OR Score3 评分最高的人,即使他的评分低于 Bob Bobbing 的评分,执行上述查询也会给我 Joe Bloggs。

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

【问题讨论】:

  • 23 列?我认为最好添加带有分数和分值的新表。此外,“Score1 OR Score2 OR Score4 评分最高的人” 很难准确理解。您能否添加一些期望结果的样本?
  • 不清楚您所说的“组合”列是什么意思。在您的“Score2 OR Score3”示例中,看起来 Joe 和 Bob 的分数相同,但 Bob 的评分更高。 combine 是否意味着“添加”? (因此,你 SUM() 相关字段?)你能简单地先按“评级”排序吗?
  • @poundifdef 没错,Joe 和 Bob 在 Score2 和 Score3 中都为零,因此选择继续评分。如果我先按评分排序,Marjorie 会排在首位,因为她的评分比其他任何人都高。我需要先考虑分数,然后是评分。如果指定的分数列中没有零的人,那么它必须考虑那些具有-10 的人,并从该池中选择评分最高的人。

标签: mysql sql sorting


【解决方案1】:

您可能想要使用GREATEST() 函数:

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

此代码 sn-p 为您的示例中的 score2 和 score3 列执行您想要的操作:

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

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

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

【讨论】:

  • 这就是解决方案。我以前不知道 GREATEST - 不错,非常感谢!
【解决方案2】:

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

如下使用:

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

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

【讨论】:

    【解决方案3】:

    请参阅 Stack Overflow 上的 this reference answer

    您可以使用(column1 + column2) 将列添加在一起

    例如:

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

    【讨论】:

    • 列总和与相对排序有什么共同点?
    • 我一定误解了 OP 的要求 combine two or more score columns 听起来像是他想对列求和
    • OP 说他们想知道 Score1 OR Score2 OR Score4 的最高分。您的解决方案适用于 AND 案例。
    • 见我上面的评论。这确实是一个旧帖子,但我认为我误解这个问题的错误仍然增加了价值,因为知道什么是不想要的。
    【解决方案4】:

    如果列中的数据是字符串,那么在ORDER BY 中使用IF() 可以工作。例如,如果您有两列(例如,Name_FirstName_Last)并且如果Name_LastNULL,您希望通过Name_First 订购,如果不是NULL,您希望通过Name_Last 订购,那么:

    SELECT * FROM MyTable ORDER BY IF(Name_Last IS NULL,Name_First,Name_Last);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-09
      • 2012-01-20
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多