2010-06-18 5 views
2

J'essaie de mettre à jour un champ dans une table, à partir de la somme d'un autre champ, dans une autre table.Table de mise à jour mysql d'une autre table

company_tbl (primaire, companySize, companyName) location_tbl (primaire, COMPANYID, locationSize, locationName)

Les deux tableaux lien par company_tbl.PRIMARY = location_tbl.companyID

update company_tbl comp, location_tbl loc 
set companySize = sum(locationSize) 
where comp.PRIMARY = loc.companyID 

Je reçois une erreur de « utilisation non valide de la fonction de groupe »

une entreprise peut avoir plusieurs emplacements

Est ce que je veux faire possible? Je veux prendre la somme des emplacements, qui appartiennent à une société spécifique, et mettre à jour le companySize avec la somme.

Merci!

Répondre

9

Utilisation:

UPDATE company_tbl comp 
    SET companySize = (SELECT SUM(lt.locationSize) 
         FROM location_tbl lt 
         WHERE lt.companyid = comp.primary) 

... or you could use a view, contenant:

SELECT c.primary, 
      COALESCE(SUM(lt.locationsize), 0) AS companysize 
    FROM company_tbl c 
LEFT JOIN location_tbl lt ON lt.companyid = c.primary 
+0

Une petite mise à jour de votre requête. OÙ lt.companyid = comp.primary Ou bien chaque companySize sera le même :-) Je le prends donc ce n'est pas possible de faire la mise à jour avec cette syntaxe? mise à jour company_tbl comp, location_tbl loc set companySize = somme (locationSize) où comp.PRIMARY = loc.companyID Juste par curiosité, j'aime apprendre de nouvelles choses :-) – Kukoy

+0

@Idealflip: S'il n'y a pas de table alias (en général ne sont pas acceptés dans les instructions UPDATE), alors les références de colonnes sans alias de table sont pour la table qui n'a aucun alias défini. –

+0

Vous devriez utiliser la vue. Sauf si vous avez absolument besoin d'optimiser pour les lectures sur la taille de l'entreprise, il est préférable de le calculer à chaque fois. Si vous pouvez calculer la valeur d'une colonne d'une autre, vous vous configurez pour une situation où les deux valeurs ne sont pas synchronisées. – Kendrick

2

d'abord initialiser le companySize à zéro:

UPDATE company_tbl SET companySize = 0; 

Ensuite, pour chaque ligne de l'emplacement correspondant, ajoutez le emplacementTaille:

UPDATE company_tbl comp JOIN location_tbl loc ON comp.PRIMARY = loc.companyID 
SET comp.companySize = comp.companySize + loc.locationSize; 

Vous obtenez la somme souhaitée au moment où elle a traité tous les emplacements correspondants pour chaque société.

Questions connexes