我是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场比赛的比赛。
我想我可以为每个参赛者制作一张新桌子,这是他们参加比赛的记录,但这会延伸到数百张桌子......必须有更好的方法。
是否可以这样做?
答案 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;
如果某个其他列确定了上一条记录,则where
和order 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