2015-09-05 2 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 смотрит и получает предыдущий race_id за тот же runner_id.

Для иллюстрации; Что бы я хотел сделать, скажем, что бегун принял участие в 6 гонках из 10 гонок в этом году, в ряду, касающемся его 5-й гонки, я хочу знать гонку 4-й гонки.

Я думаю, я мог бы создать новый стол для каждого бегуна, который был рекордным количеством гонок, в которых они принимали участие, но это растягивалось бы до сотен таблиц ... должен быть лучший способ.

Возможно ли это?

+0

Если вы не хотите беспокоиться о том, чтобы всегда исправлять свои данные, придумайте гениальный запрос – Drew

+2

Таблицы SQL представляют собой * неупорядоченные * наборы. Нет такой вещи, как предыдущая строка, если у вас нет столбца, содержащего информацию для заказа. Примерами являются числовое значение расы, идентификатор автоматического увеличения или дата создания. –

+0

проблема, о которой упоминает @GordonLinoff, в частности: представить в вашей таблице трех столбцов, как вы ее здесь представляете, вы вставляете новую строку '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; 

Если какой-либо другой столбец определяет предыдущий рекорд, то where и order by изменится.

+0

Это добавляет столбец с предыдущей расой, но я пытаюсь получить предыдущий 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, как бы выглядел запрос, что бы добавить столбец и захватить предыдущий race_id для этого бегуна? – Cowan6891

+0

'выберите race_id из Race_Runner где Fecha <> (выберите макс (Fecha) от Race_Runner) заказ по Fecha убыв предел 1' –

+0

Ok получил это работает. Он получает race_id для самой последней гонки, когда вручную загружается runner_id. Это не то, что мне нужно, хотя. Теперь я исправил исходный вопрос. – Cowan6891

Смежные вопросы