2015-12-23 5 views
0

У меня есть эта структура таблицы:SQL SUM группы при наличии SUM

USER_ID | POINTS_BALANCE 

10  | 180   
10  | 20    
10  | 100     
10  | 120 

Как я могу обновить поле points_balance, например, 500 для всех этих пользователей:

select user_id, sum(points_balance) 
from `user_points_table` 
group by user_id 
having SUM(points_balance) >= 400 && SUM(points_balance) <= 499 

Или можно вставить новый ROW для user_id, который having sum(points_balance) между 400 и 499?

EDIT:

Например:

select user_id, sum(points_balance) 
from `user_points_table` 
where user_id = 74 
group by user_id 
having SUM(points_balance) >= 400 && SUM(points_balance) <= 499 

Результат:

USER_ID | POINTS_BALANCE 
74  | 434 <-- How can I update this result to 500? 
+2

Редактировать свой вопрос и предоставить результаты поиска. –

+0

вы можете объяснить, в чем проблема: – essanousy

+0

Итак, вы хотите увеличить 1 из строк (если это так, какая строка?) Или добавить новую строку, чтобы увеличить ее до 500? – Sean

ответ

0

Вы не можете обновить информацию, полученную. Если вы хотите, чтобы отобразить различное число от того, что вы получены, вы можете сделать это:

select 
    user_id, 
    case 
    when totals < 500 then 500 
    else totals 
    end as totals 
from (
    select user_id, sum(points_balance) as totals 
    from test 
    -- where user_id = 10 
    group by user_id 
    having totals between 400 and 499 
) t 
-- where user_id = 10; 

+---------+--------+ 
| user_id | totals | 
+---------+--------+ 
|  10 | 500 | 
+---------+--------+ 

Если результат

select user_id, sum(points_balance) as totals 
from test 
-- where user_id = 10 
group by user_id 
having totals between 400 and 499; 

является

+---------+--------+ 
| user_id | totals | 
+---------+--------+ 
|  10 | 420 | 
+---------+--------+ 

, и вы хотите, чтобы поднять это до 500, вы знаете, что разница между 500 и 420 составляет 80. Поэтому вставьте новую запись:

insert into test (user_id, points_balance) values (10, 80); 

или обновить одну из записей в:

update test set points_balance = points_balance + 80 
where user_id = 10 and points_balance = 120; 

Вопрос следует - какой из многочисленных записей в течение 10 будет обновлять? Надеюсь, у вас есть идентификатор, чтобы однозначно идентифицировать каждую строку. Если у вас есть это, обновите строку с наименьшим id. Если у вас нет поля, которое однозначно идентифицирует каждую строку, это будет подходящее время для создания одного такого поля.

Чтобы сделать это за один выстрел, вы должны создать хранимая процедура или написать скрипт в PHP/Python/на любом языке, который вам удобен.

1

Поскольку вы хотите добавить новую новую строку в таблицу, один из вариантов является использование insert into select:

insert into user_points_table 
select user_id, 500-sum(points_balance) 
from `user_points_table` 
where user_id = 74 
group by user_id 
having SUM(points_balance) >= 400 && SUM(points_balance) <= 499; 
+0

Благодарим за помощь. Этот return 'Column count не соответствует количеству значений в строке 1'. – simo

0

ОБНОВЛЕНО

Как я понимаю ваш вопрос, вы ищете способ установить, что каждый пользователь указывает на минимум 500 добавив разницу. Итак, ваше решение может выглядеть следующим образом:

mysql> DELIMITER //; 
-> CREATE PROCEDURE updateMinimum() 
-> BEGIN 
-> DECLARE u,s INT; 
-> DECLARE cur CURSOR FOR 
-> SELECT user_id, SUM(points) FROM user_points GROUP BY user_id; 
-> OPEN cur; 
-> read_loop: LOOP 
-> FETCH cur INTO u,s; 
-> IF s < 500 THEN 
->  INSERT INTO user_points (user_id, points) VALUES (u, 500-s); 
-> END IF; 
-> END LOOP; 
-> CLOSE cur; 
-> END// 
mysql> DELIMITER ; 
mysql> CALL updateMinimum(); 

Он расскажет вам есть No data, но не против - это сделал трюк.Просто используйте SELECT, чтобы проверить это:

SELECT user_id, SUM(points) FROM user_points GROUP BY user_id; 

Вы можете использовать CALL updateMinimum() всякий раз, когда вы хотите, в любое время. Или, если вам это больше не нужно, вы можете удалить его DROP PROCEDURE updateMinimum();

+0

Как я могу ограничить его 'IF s> = 400 && IF s <= 499'? Кстати Он возвращается 'У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'DECLARE cur FOR SELECT user_id, SUM (points_balance) FROM 'user_points_table' в строке 2'. – simo

+0

Вы можете ограничить это, изменив 'IF s <500 THEN' на' IF s> = 400 И s <= 499 THEN'. И синтаксическая ошибка не должна присутствовать, если объявление начинается после 'BEGIN'. –

+0

Использование: 'DECLARE cur ДЛЯ SELECT user_id, SUM (points_balance) FROM user_points GROUP BY user_id; DECLARE CONTINUE HANDLER ДЛЯ НЕ НАЙДЕНО КОМПЛЕКТ done = TRUE; BEGIN OPEN cur; read_loop: LOOP FETCH IN IN u, s; IF s> = 400 И s <= 499 THEN INSERT INTO user_points (user_id, points_balance) VALUES (u, 500-s); END IF; CLOSE cur; END; ' Результат:' У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «CLOSE cur» в строке 1'. – simo