2015-09-05 60 views
1

我是MySQL的新手,我遇到了以下问题;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回顾,并得到了相同的runner_id以前race_id

举例说明; 我想要做的是,说一名参赛选手参加了当年10场比赛中的6场比赛,在第五场比赛中我想知道他的第四场比赛的race_id。

我想我可以为每个参赛者的记录都制作一张新表,但这可能会延伸到数百张桌子......必须有更好的方式。

可以做到这一点吗?

+0

除非你想担心总是修补你的数据,想出一个巧妙的查询 – Drew

+2

SQL表示*无序*集。除非您有包含订购信息的列,否则没有上一行的内容。示例是比赛的数值,自动增量ID或创建日期。 –

+0

@GordonLinoff提到的问题,具体是:想象你在3列表中,因为你在这里呈现它,你插入一个新的行'10 J-'。这会使您的当前状态无效。 – hoijui

回答

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会改变。

+0

这增加了一个包含以前的race_id的列,但我试图获得以前跑步者的race_id。 – Cowan6891

+0

@ Cowan6891。 。 。固定。 –

+0

就是这样!完美地工作谢谢你。 – Cowan6891

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

对不起,我对MySQL有些green然心动,查询看起来会是什么样子,会添加列并获取该跑步者以前的race_id? – Cowan6891

+0

'从Race_Runner 选择race_id 其中日期星<>(选择最大(从Race_Runner日期星)) 为了通过日期星降序 极限1' –

+0

确定了现在这方面的工作。当手动输入runner_id时,它获得最近比赛的race_id。这不是我需要的。我已经修改了原来的问题。 – Cowan6891