I'm working with a table (results) that has the following structure (don't ask, I didn't build it)
id | record_type | user_id | answer_id | choice | score | total | email
-------------------------------------------------------------------------------
1 email xxxxxxx 0 [email protected]
2 answer xxxxxxx aaaaaa A 0
3 answer xxxxxxx bbbbbb A 0
4 answer xxxxxxx cccccc B 10
5 email yyyyyyy 0 [email protected]
6 answer yyyyyyy aaaaaa A 0
7 answer yyyyyyy bbbbbb A 0
8 answer yyyyyyy cccccc A 0
9 email zzzzzzz 0 [email protected]
10 answer zzzzzzz aaaaaa A 0
11 answer zzzzzzz bbbbbb A 0
12 answer zzzzzzz cccccc B 10
It's a survey and the score values of correct answers changed after the surveys were submitted. I've already run an update to set the score values for "correct" answers to 10 and now I need to update the total for the rows with record_type: email so we can contact the winners.
The goal would be to set the total column for rows 1,5 and 9 to be 10,0 and 10
I'm thinking of something like this
UPDATE results SET total = SUM(score)
FROM results GROUP BY user_id WHERE user_id = user_id
But that doesn't look right and I'm worried that I may be going down the wrong path.
To update data in a table, you need to: First, specify the table name that you want to change data in the UPDATE clause. Second, assign a new value for the column that you want to update. In case you want to update data in multiple columns, each column = value pair is separated by a comma (,).
Specific columns can be modified using the SET clause by supplying new values for that column. The WHERE clause can be used to specify the conditions those identify which rows to update. Without using WHERE clause, all rows are updated. The ORDER BY clause is used to update the order that is already specified.
Update with condition WHERE clause can be used with SQL UPDATE to add conditions while modifying records. Without using any WHERE clause, the SQL UPDATE command can change all the records for the specific columns of the table.
Notice the WHERE clause in the UPDATE statement. The WHERE clause specifies which record(s) that should be updated. If you omit the WHERE clause, all records in the table will be updated!
UPDATE
results AS r
JOIN
( SELECT user_id,
SUM(score) AS sum_score
FROM results
WHERE record_type = 'answer'
GROUP BY user_id
) AS grp
ON
grp.user_id = r.user_id
SET
r.total = grp.sum_score
WHERE
r.record_type = 'email';
Regarding efficiency, an index on (record_type, user_id, score)
would help both to efficiently compute the derived table and with the self-join.
You are almost there.
UPDATE results r SET total =
(select SUM(score) FROM results r2
WHERE r2.user_id = r.user_id
and r2.record_type = 'answer')
where r.record_type = 'email';
This should work
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With