2016-06-01 5 views
0

У меня есть эти две таблицы:Как обновить одну таблицу на основе другой?

// user 
+----+-------+------------+ 
| id | name | total_rep | 
+----+-------+------------+ 
| 1 | Jack | 100  | 
| 2 | Peter | 334  | 
| 3 | John | 1   | 
| 4 | Ali | 5463  | 
+----+-------+------------+ 

// rep 
+----+------------+---------+------+ 
| id | reputation | id_user | done | 
+----+------------+---------+------+ 
| 1 | 5   | 2  | 1 | 
| 2 | 2   | 3  | 1 | 
| 3 | 15   | 2  | Null | 
| 4 | 10   | 2  | Null | 
| 5 | 5   | 4  | 1 | 
| 6 | 10   | 3  | Null | 
+----+------------+---------+------+ 

Я пытаюсь суммировать количество reputation столбца из rep таблицы, где done является Null для конкретного пользователя, а затем добавить его в total_rep колонку из user таблицы. Так что ожидается выход:

// specific user 
$id = 2; 

// user 
+----+-------+------------+ 
| id | name | total_rep | 
+----+-------+------------+ 
| 1 | Jack | 100  | 
| 2 | Peter | 359  | -- this is updated 
| 3 | John | 1   | 
| 4 | Ali | 5463  | 
+----+-------+------------+ 

Примечание: Тогда я буду обновлять done колонку и установить все Null значения для этого пользователя в 1. (это не мой вопрос, я могу это сделать сам)

Как это сделать?

+0

Поиск по SO для запросов «mysql update group by». Похоже, вы можете достичь своей цели с помощью подзапроса, где вы будете группировать на 'rep', после чего вы присоедините его к таблице' user' и обновите ее. – michaJlS

ответ

0

Вы не можете обновить две таблицы в одном из операторов, поэтому вам потребуется выполнить транзакцию. Или, может быть, в какой-то код сделать следующее, что я сделаю это в PHP

$query_result=DB::select('Select sum(reputation) as reputation, id_user from rep where done is null group by id_user'); 

foreach($query_result as $result){ 
    //update the data 
} 

Вы должны принять данные и обновления firstable таблицы репутации, чтобы очистить его, а затем таблица пользователя просуммировать респ значения

1

Один из способов сделать это - использовать результат подзапроса как scalar value в заявлении об обновлении.

UPDATE `user` 
SET total_rep = total_rep + (
    SELECT SUM(reputation) AS rep_sum FROM `rep` WHERE done IS NULL AND id_user = 2) 
WHERE id = 2; 
+0

Это правильно .. upvote .. Также я думаю, что мы можем сделать это с помощью 'join' вместо этого подзапроса. Это возможно? – stack

+0

Да, это возможно. Тем не менее, мне недостаточно эксперта, чтобы обсудить производительность одного и другого. –

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