2013-08-30 4 views
0

Я добавил новый столбец «sums» в свою таблицу, и я пытаюсь суммировать значения из столбца «vals», а затем обновлять «суммы» в одной таблице, в соответствии с алгоритмом как показано ниже в таблице.Суммировать значения из строк в таблице MySQL

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

Любая подсказка, как написать это красиво?

 
-------------------------------------------------- 
| id | sets | parts | vals | sums | 
|-------|---------|---------|----------|---------| 
| 1 | 1 | 1 | 2  | 2 | 
|-------|---------|---------|----------|---------| 
| 2 | 1 | 2 | 3  | 2+3=5 | 
|-------|---------|---------|----------|---------| 
| 3 | 1 | 3 | 5  |2+3+5=10 | 
|-------|---------|---------|----------|---------| 
| 4 | 2 | 1 | 4  | 4 | 
|-------|---------|---------|----------|---------| 
| 5 | 2 | 2 | 1  | 4+1=5 | 
|-------|---------|---------|----------|---------| 
| 6 | 2 | 3 | 2  | 4+1+2=7 | 
|-------|---------|---------|----------|---------| 
| 7 | 3 | 1 | 6  | 6 | 
|-------|---------|---------|----------|---------| 


+0

Вы хотите сделать это, обновив текущую базу данных или только для своих следующих вставок. (Или оба?) – Sugar

+0

Вы пытаетесь суммировать каждые 3 строки? –

+0

одна строка без изменений, затем суммируйте 2 строки, затем суммируйте 3 строки. Стол довольно большой около 100000 строк. Я хочу обновить текущую базу данных, но не очень часто. – Krzysztof

ответ

0

Это должно возвращать значение, которое вы хотите для сумм:

SELECT t.id 
    , IF([email protected]_sets,@i:[email protected]+t.vals,@i:=t.vals) AS `sums` 
    , @prev_sets := t.sets AS prev_sets 
    FROM mytable t 
    JOIN (SELECT @prev_sets := NULL, @i := 0) i 
ORDER BY t.sets, t.parts 

Вы можете использовать это как вложенное представление в операторе обновления

UPDATE (SELECT t.id 
       , IF([email protected]_sets,@i:[email protected]+t.vals,@i:=t.vals) AS `sums` 
       , @prev_sets := t.sets AS prev_sets 
      FROM mytable t 
      JOIN (SELECT @prev_sets := NULL, @i := 0) i 
      ORDER BY t.sets, t.parts 
     ) s 
    JOIN mytable r 
    ON r.id = s.id 
    SET r.sums = s.sums 

Из примера данных, это выглядит как вы хотите «группировки» на sets, и вы хотите заказать на parts в каждой группе.

+0

Он работает точно так, как должен работать. :) Благодаря. – Krzysztof

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