2016-08-12 5 views
0

У меня есть две таблицы DailyVisits и TotalSum Моя цель состоит в том, чтобы добавить DailyVisits в с хранимой процедурой/запросом, который я буду запускать в конце дня.SQL - вставить или обновить результат из другой таблицы

DailyVisits 
UserId,PageId,Visits 
1,1,32 
2,123,34 
4,12,213 
5,1,1 

TotalSum 
UserId,PageId,TotalVisits 
1,1,300 
1,41,2 
3,12,213 
5,1,653 

и так далее.

Я пробовал два подхода, но я не могу решить эту проблему.

Ниже моих запросов для достижения этого, если у вас есть другое предложение/запрос, достаточно простой для понимания, я ценю вашу помощь.

Approach1:

delimiter $$ 
CREATE PROCEDURE UPSERT_DAILYSUM() 
BEGIN 
    IF EXISTS (SELECT Id, PageId FROM DailyVisits) THEN 
     UPDATE TotalSum TotalVisits = TotalVisits + (SELECT Visits FROM DailyVisits); 
    ELSE INSERT INTO TotalSum (UserId,PageId,TotalVisits) 
         VALUES (SELECT Id,PageId,Visits); 
    END IF 
END $$ 
delimiter ; 

Approach2:

INSERT INTO TotalSum (UserId,PageId,TotalVisits) VALUES(SELECT * FROM DailyVisits) 
ON DUPLICATE KEY UPDATE (PageId,TotalVisits) 
       VALUES(SELECT PageId,Visits FROM DailyVisits) 

Это то, что я борюсь с: Как я буду получать различные значения, когда ключ не существует? Могу ли я использовать RIGHT JOIN (или LEFT JOIN) и проверить значения NULL, а затем добавить правую (или левую) таблицу?

+1

ли эта помощь? http://stackoverflow.com/questions/11883237/insert-or-update-table-from-another-table-with-composite-primary-key –

+0

О, да! Я никогда не думал делать два обновления и вставлять отдельно. Благодаря! –

+0

, пожалуйста, дайте мне возвышение, если мой ответ помог вам –

ответ

0

же, как вам нужно, как это:

Проблема я не знаю, что вы хотите сделать в обновлении и вставить часть:

delimiter $$ 
CREATE PROCEDURE UPSERT_DAILYSUM() 
BEGIN 

Declare idvar int(50) DEFAULT 0; 
Declare pageidvar int(50) DEFAULT 0; 

SELECT Id, PageId INTO idvar,pageidvar FROM DailyVisits; 

if(LENGTH(idvar)>0 THEN 
    UPDATE TotalSum TotalVisits = TotalVisits + (SELECT Visits FROM DailyVisits); 
ELSE 

INSERT INTO TotalSum (UserId,PageId,TotalVisits) VALUES (SELECT Id,PageId,Visits); 

END $$ 
delimiter ; 
+0

Что вы хотите вставить и что вы хотите обновить. Я имею в виду, какую ценность данных. это просто пример того, как вы можете сделать это. Есть так много способов сделать это –

+0

Я хочу получить текущую сумму для столбца Visits, если UserId & PageId соответствует. Если они не существуют, то создайте новую запись и так далее. –

+0

Что значит текущая сумма? когда каждый раз, когда запись изменилась? –