2013-11-09 2 views
1

базы данных:Регистрация Его к предыдущей строке Ближайшей Даты

id | account | date  | random_data 
1 | 1  | 01/01/2013 | qw 
2 | 2  | 05/01/2013 | er 
3 | 2  | 09/01/2013 | ty 
4 | 1  | 05/01/2013 | ui 
5 | 2  | 11/01/2013 | op 
6 | 1  | 12/01/2013 | as 

Привет, так скажем, я хочу, чтобы записи, начиная с 05/01/2013 - обратите внимание, что prev_date для первой строки все еще показывает более раннюю дату, чем 05/01, что означает, что всю таблицу нужно искать.

Результат данные:

account | cur_date | random_data | prev_date | prev_rand_data 
1  | 05/01/2013 | ui   | 01/01/2013 | qw 
1  | 12/01/2013 | as   | 05/01/2013 | ui 
2  | 05/01/2013 | er   | null  | null 
2  | 09/01/2013 | ty   | 05/01/2013 | er 
2  | 11/01/2013 | op   | 09/01/2013 | ty 

Так что я не уверен, что это самый лучший, самый оптимизированный запрос я мог бы использовать для этого. Я не против php-решения, но не уверен, насколько это лучше. Некоторые идеи я рассмотрел:

  1. Какая-то присоединиться на одной и той же таблице - не знаю, как будто
  2. подзапросы на избранных -

    select date as cur_date , (select max(date) from table where date < cur_date group by account) as prev_date... - это, кажется, что это может быть невероятно интенсивным

  3. Переменные сеанса - установить переменную сеанса для каждой строки, которая будет предыдущими данными для следующей строки, например

    select date as cur_date , @prev_date as prev_date , @prev_date:=date...

Кто-нибудь имел опыт работы с проблемой, как это и было хорошее решение? Есть ли положительные негативы с любыми идеями, которые у меня есть, которые могут вызвать проблемы в будущем?

ответ

1

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

Сначала запрос.

select account, date, random_data 
from thetable 
where date >= YourDateVariable 

union 

select account, date, random_data 
from thetable join 
(select account acc, max(date) maxdate 
from thetable 
where date <= YourDateVariable 
group by account) x on account = acc and date = max(date) 
where date <= YourDateVariable 

order by account, date 

Для кода приложения, выполните следующие действия:

Set a variable called ThisAccount to 0. 
Set a row counter variable to 0. 
Create an empty 2D array 
Start looping through your query results 
Put the account value and random data into the first two columns 
    of the next available row of the array 
Compare the account value to the value of the ThisAccount variable. 
    If they are the same, get the previous date and random data from 
    the previous row in the array. 
Set the ThisAccount variable to the current account value. 
Increment your row counter variable 
End of loop. 
Смежные вопросы