2015-07-14 3 views
0

У меня есть несколько таблиц, каждая из которых имеет свои собственные баллы для каждого пользователя. Я хотел бы создать триггер, который суммирует все эти баллы для каждого пользователя и помещает их в поле под названием score в таблице users.Обновление учетной записи пользователя из других таблиц

Tables (They essentially have the same fields with a few different ones) : 

Table 1 : {id, user_id, score} 
Table 2 : {id, user_id, score} 
Table 3 : {id, user_id, score} 

users : {id, name, overall_score} 

// В целом _SCORE имеет значение уже, так что я просто хочу, чтобы добавить поля оценки от других таблиц к этому.

+0

Сколько таблиц с идентичной структурой данных, которые вы, как указаны, вы упомянули 3 так эта сумма баллов из всех таблиц в таблицу пользователей? –

+0

Err, если iv понял правильно, да. Таблицы 1 - 3 имеют собственный счет для каждого пользователя. Я хочу добавить их (например, после обновления) и добавить их в total_score – Jess

ответ

0

Чтобы выбрать данные из нескольких таблиц, вы можете использовать SQL JOINS.

Смотрите пример ниже:

SELECT table1.score, table2.score, table3.score 
FROM table1 LEFT JOIN table2 
ON table1.id=table2.id LEFT JOIN table3 ON table1.id=table3.id 

Этот код будет выбрать столбец оценка от table1, table2 и Таблица3 и создать одну строку за user_id, каждый из которых содержит один балл-столбец/таблица (в данном случае 3/ряд). Это почти похоже на четвертую таблицу, содержащую все оценки, а затем, когда вы извлекаете их в PHP, это будет похоже на выборку существующей строки из базы данных.

EDIT:

обновить таблицу пользователей в том же запросе, вы могли бы использовать что-то вроде этого:

UPDATE `users`, 
(
    SELECT table1.id as tid, table1.score as t1, 
    table2.score as t2, table3.score as t3 
    FROM table1 LEFT JOIN table2 ON table1.id=table2.id 
    LEFT JOIN table3 ON table1.id=table3.id 
) as total 
SET total_score = (t1 + t2 + t3) WHERE id = tid 
+0

Есть ли способ фактического обновления total_score в таблице пользователей с этим? – Jess

+0

См. Мой обновленный ответ –

0

Для достижения этой цели позволяет первым написать запрос на выборку и получить сумму всех баллы для каждого пользователя из 3 заданных таблиц, и это то, как это может быть сделано

select u.*, y.total from users u 
left join 
(
    select user_id,sum(score) as total from(
    select user_id, score from table_1 
    union all 
    select user_id, score from table_2 
    union all 
    select user_id, score from table_3 
)x group by x.user_id 
)y on y.user_id = u.id 

Вот демо http://www.sqlfiddle.com/#!9/6f936/1

Теперь позволяет преобразовать выберите на команду обновления, и это будет, как

update users u 
left join 
(
    select user_id,sum(score) as total from(
    select user_id, score from table_1 
    union all 
    select user_id, score from table_2 
    union all 
    select user_id, score from table_3 
)x group by x.user_id 
)y on y.user_id = u.id 
set u.overall_score = coalesce(y.total,0) 

здесь дем http://www.sqlfiddle.com/#!9/c6993/1

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