1

我在 MYSQL 中处理的查询有以下部分。

SELECT
  MAX(CAST(MatchPlayerBatting.BatRuns AS SIGNED)) AS HighestScore
FROM
  MatchPlayerBatting

它返回正确的结果。但是,还有另一列我需要它来解决。

也就是说,如果它找到的最大值在“BatHowOut”中也有一个“not out”的值,它应该将结果显示为例如 96* 而不仅仅是 96。

怎么可能做到这一点?

为了帮助使数据具体化,请考虑两种情况:

BatRuns   BatHowOut
    96    not out
    96    lbw

BatRuns   BatHowOut
    96    not out
   102    lbw

对于第一个数据,答案应该是'96*';对于第二个,'102'

4

2 回答 2

1

您可以像这样使用自联接来实现这一点:

SELECT t1.ID
, CONCAT(t1.BatRuns, 
         CASE WHEN t1.BatHowOut = 'Not Out' THEN '*' ELSE '' END
        ) AS HighScore
  FROM MatchPlayerBatting t1
  JOIN
  (
      SELECT MAX(BatRuns) AS HighestScore
      FROM MatchPlayerBatting
  ) t2
  ON t1.BatRuns = t2.HighestScore
于 2013-08-20T04:58:20.783 回答
0

如何按降序排列分数并仅选择第一条记录?

select concat(BatRuns , case when BatHowOut = 'not out' then '*' else '' end)
  from mytable
order by cast(BatRuns as signed) desc,
        (case when BatHowOut = 'not out' then 1 else 2 end)
limit 1;

样品在这里

如果您想找到每个玩家的最高得分,这里有一个可能不优雅但非常有效的解决方案。

select PlayerID,
       case when runs != round(runs)
                 then concat(round(runs),'*')
            else
                 round(runs)
       end highest_score
  from (select PlayerID,
               max(cast(BatRuns as decimal) + 
                   case when BatHowOut = 'not out' then 0.1 else 0 end
                  ) runs
          from MatchPlayerBatting
         group by PlayerID) max_runs;

这利用了这样一个事实,即运行永远不能是分数,只能是整数。当最高分并列且其中一人不败时,不败分加 0.1 为最高分。这可以稍后删除并与 * 连接。

样品在这里

于 2013-08-20T05:18:52.277 回答