MySQL - 返回上一行添加计算列

时间:2015-09-05 15:25:49

标签: mysql sql database

我是MySQL的新手,我遇到了以下问题的麻烦;

我们称这个表为runners_table

+---------+-----------+
| race_id | runner_id | 
+---------+-----------+
|    10   |  A        |   
|    10   |  E        | 
|    10   |  V        | 
|    23   |  G        | 
|    23   |  J        |  
|    23   |  A        | 
|    67   |  E        | 
|    67   |  G        | 
|    67   |  X        | 
+---------+-----------+

我想添加一个像这样的新列;

+---------+-----------+--------------+
| race_id | runner_id | prev_race_id | 
+---------+-----------+--------------+
|    10   |  A        | -            |
|    10   |  E        | -            |
|    10   |  V        | -            |
|    23   |  G        | -            | 
|    23   |  J        | -            | 
|    23   |  A        | 10           | 
|    67   |  E        | 10           |
|    67   |  G        | 23           | 
|    67   |  X        | -            | 
+---------+-----------+--------------+

其中prev_race_id回顾并获取同一race_id的上一个runner_id

说明; 我想做的是,一名跑步者参加了当年10场比赛中的6场比赛,与他的第5场比赛有关,我想知道他的第4场比赛的比赛。

我想我可以为每个参赛者制作一张新桌子,这是他们参加比赛的记录,但这会延伸到数百张桌子......必须有更好的方法。

是否可以这样做?

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用相关子查询。假设race_id按数字顺序排列:

select r.*,
       (select r2.race_id
        from runners_table r2
        where r2.race_id < r.race_id and r2.runner_id = r.runner_id
        order by r2.race_id desc
        limit 1
       ) as prev_race_id
from runners_table r;

如果某个其他列确定了上一条记录,则whereorder by会发生变化。

答案 1 :(得分:2)

你可以创建3个表,一个用于竞赛,一个用于跑步者,一个用于它们之间的关系。由于您存储了每场比赛的日期,因此您可以轻松获得最佳比赛日期。

   CREATE TABLE Race(
         race_id INT,
         data VARCHAR(100)
       );

   CREATE TABLE Runner(
         runner_id INT,
         data VARCHAR(100)
       );

   CREATE TABLE Race_Runner(
         race_id INT,
         runner_id INT,
         fecha DATETIME
       );

如果您想知道特定跑步者的上一个比赛日期,请尝试以下查询:

select race_id 
from Race_Runner 
where fecha <> (select max(fecha) from Race_Runner) 
and runner_id = ? -- the runner you want
order by fecha desc 
limit 1

以下查询返回具有上一个比赛日期的每个选手的值:

select runner_id, 
LAG(fecha) over (partition by runner_id order by fecha desc) 
as previous_date_race
from Race_Runner