2014-02-06 4 views
0

Чтение около Triggers, Equi-Joins и cross-joins имеет мою голову, вращающуюся и неспособную выяснить, что мне нужно.Вставка данных в таблицу автоматически на основе другой таблицы

В принципе, у меня есть 3 таблицы:

Table 1: Users 
    id 
    username 
    score 

Table 2: Acts 
    act_id 
    act 
    user_id 
    act_score 

Table 3: Votes 
    vote_id 
    act_id 
    user_voter 
    score_given 

Когда голос брошен, я хочу MySQL для автоматического добавления score_given к пользователям score' and to the act_score`.

Возможно ли это, и какой тип JOIN и/или TRIGGER мне нужен. И если кто-то чувствует себя очень щедрым, могут ли они предоставить мне код sql? Я действительно изо всех сил, чтобы получить мою голову вокруг этого ...

+0

вам нужно «после обновления» TRIGGER в таблице голосов. – Melon

ответ

1

Я хотел бы предложить использовать VIEW для расчета баллов для каждого User или Act по мере необходимости. Это гарантирует, что оценки всегда будут правильными, и вам не потребуется много триггеров.

ОБНОВЛЕНО:

1) Удалить результаты из Users и Acts таблиц;

2) Создайте представление ActsWithScore:

CREATE VIEW ActsWithScore AS 
SELECT 
    *, 
    (SELECT SUM(Votes.score) FROM Votes WHERE Votes.act_id = Acts.act_id) AS act_score 
FROM Acts; 

3) Создайте представление UsersWithScore:

CREATE VIEW UsersWithScore AS 
    SELECT 
     *, 
     (SELECT SUM(ActsWithScore.act_score) FROM ActsWithScore WHERE ActsWithScore.user_id = Users.id) AS user_score 
    FROM Users; 

4) Теперь вы можете запросить данные по следующим командам:

SELECT * 
FROM UsersWithScore 

и

SELECT * 
FROM ActsWithScore 

После того, как вы сделали все эти изменения, не забудьте изменить Users к UsersWithScore и Acts к ActsWithScore во всех тех местах, где вы запрашиваете счет.

PS. Извините, сейчас у меня нет MYSQL, так что голый со мной, если есть некоторые синтаксические ошибки.

+0

Как использовать 'VIEW'? – Wildcard27

+0

Спасибо, попробуй сейчас. Мне не нужно ничего менять в моем скрипте, поскольку я еще не реализовал систему голосования/оценки. Я начинаю строить его, когда мы говорим :) – Wildcard27

+0

Обновлен с помощью примера 'VIEW's.Я действительно рекомендую переключиться на это решение, поскольку «TRIGGER's обычно считается плохой практикой, поскольку они могут делать неожиданные вещи при обновлении данных. –

0
CREATE TRIGGER TRIGGER_NAME 

AFTER INSERT ON TABLE_1 
FOR EACH ROW 
BEGIN 
// Insert into another table values (new.x, new.y...); 
END; 
+0

http://www.mysqltutorial.org/create-the-first-trigger-in-mysql.aspx –

+0

Я предполагаю, что я просто набираю это в sql-часть 'mysqladmin', и он будет настроен автоматически? – Wildcard27

+0

если у вас есть heidiSql или редактор, вы можете править clik на таблице n do –

1

Триггер - наиболее очевидное решение, но он может добавить проблему обслуживания. Если приложение не так уж и велико, вам будет плохо. Также я предпочитаю делать обе вставки на бизнес-уровне. Если вы делаете вставку, почему бы не сделать две вставки? Он может добавить накладные расходы на ваше приложение, но если ваше приложение не делает это, то тысячи раз/сек вам будет хорошо.

+0

Вы можете легко перейти в состояние «вне синхронизации», так как вы можете легко забыть изменять информацию по всей базе данных. –

+0

Реализация бизнес-уровня не позволяет этого. Триггер подобен событию, запускающему выполнение SP. Этот триггер может перестать возиться с вашими данными (очень вероятно, что это произойдет, если вы не положите реляционную целостность и транзакции на хорошее использование). Кстати, мне нравится ваше предложение в зависимости от сценария, что я могу использовать. – jean

+0

Я в основном согласен с вами в том, что хорошая реализация бизнес-уровня не позволит данным «выходить из синхронизации», и все должно быть хорошо, но вы не можете быть уверены, что все это всегда будет проходить через этот уровень. Как и в любой реальной жизни приложения время от времени вы можете запустить, чтобы исправить некоторые данные вручную внутри базы данных - либо из-за ошибки или ошибки пользователя. В таких случаях лучше, если нет дублирования данных, и вам не нужно обновлять данные в разных местах. Но, как вы уже сказали, это полностью зависит от того, о каком типе приложений мы говорим. –

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