2016-01-07 4 views
1

У меня есть таблица вроде этого:обновления MySQL столбец на основе ближайшего значения другого столбца

CREATE TABLE IF NOT EXISTS `exam_results` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `student_code` int(11) NOT NULL, 
    `total_level` int(11) NOT NULL, 
    `total_rank` int(11) NOT NULL, 
    `total_level_2` int(11) NOT NULL, 
    `total_rank_2` int(11) NOT NULL, 
); 

total_level и total_rank и total_level_2 имеет значение, но total_rank_2 пуста

Я хочу выбрать значение total_level_2 и найти самый близкий друг внутри tot al_level, затем обновить total_rank_2 с total_rank найденного ряда

, как я могу сделать это в запросе?


обновление:

total_level | total_rank | total_level_2 | total_rank_2 
-------------------------------------------------------------------------- 
1500   | 100   | 2000    | ? 
-------------------------------------------------------------------------- 
1700   | 90   | 3500    | ? 
-------------------------------------------------------------------------- 
2000   | 70   | 1500    | ? 

, например, в последней строке после обновления должно быть 100. ближе всего то потому что значение total_level_2 в последней строке находится внутри первой строки, так что total_rank_2 последней строки будет total_rank первого ряда

таблица после обновления:

total_level | total_rank | total_level_2 | total_rank_2 
-------------------------------------------------------------------------- 
1500   | 100   | 2000    | 70 
-------------------------------------------------------------------------- 
1700   | 90   | 3500    | 70 
-------------------------------------------------------------------------- 
2000   | 70   | 1500    | 100 
+0

Может ли быть уровень 3? – Strawberry

ответ

1
CREATE TEMPORARY TABLE IF NOT EXISTS tempresults_cal AS (select cni.*, 
         (select total_rank 
         from  exam_results ci 
         where ci.analyze_id="'.$Params->get('analyze_id').'" 
         order by abs(total_level - cni.total_level_2) 
         limit 1 
         ) as new_rank 
       from exam_results cni; 

       UPDATE exam_results 
       INNER 
        JOIN tempresults_cal 
        ON tempresults_cal.id = exam_results.id 
        SET exam_results.total_rank_2 = tempresults_cal.new_rank 
1

Попробуйте это:

Update table set total_rank_2 =(Select total_rank 
    from table 
where total_leve<=total_level_2 
order by total_level Desc 
limit 1) 
Смежные вопросы