2016-08-12 1 views
0

J'ai deux tables DailyVisits et TotalSum Mon objectif est d'ajouter DailyVisits à TotalSum avec une procédure stockée/requête que je vais exécuter à la fin de la journée.SQL - Insérer ou mettre à jour avec un résultat d'une autre table

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 

et ainsi de suite.

J'ai essayé deux approches mais je n'arrive pas à trouver une solution. Ci-dessous mes requêtes pour y parvenir, si vous avez une autre suggestion/requête assez simple pour comprendre, j'apprécie votre aide.

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 ; 

approche2:

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

Voilà ce que je me bats avec: Comment puis-je obtenir des valeurs distinctes lorsque la clé n'existe pas? Puis-je utiliser RIGHT JOIN (ou LEFT JOIN) et vérifier les valeurs NULL, puis ajouter le tableau de droite (ou de gauche)?

+1

cette aide? http://stackoverflow.com/questions/11883237/insert-or-update-table-from-another-table-with-composite-primary-key –

+0

Oh oui, oui! Je n'ai jamais pensé à faire deux mises à jour et à les insérer séparément. Merci! –

+0

s'il vous plaît donnez-moi un upvote si ma réponse vous a aidé –

Répondre

0

même que vous avez besoin comme ceci:

Le problème est que je ne sais pas ce que vous voulez faire dans la mise à jour et la partie insérer:

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

Que voulez-vous insérer et que voulez-vous mettre à jour. Je veux dire quelle valeur de données. c'est juste un exemple pour vous avoir un guide pour le faire. Il y a tellement de façons de le faire –

+0

Je veux obtenir une somme cumulée pour la colonne Visites, si les correspondances UserId et PageId. Si elles n'existent pas, créez un nouvel enregistrement et ainsi de suite. –

+0

Que voulez-vous dire par la somme en cours? quand chaque fois que l'enregistrement a changé? –