2015-09-05 59 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