2010-06-04 9 views
0

je l'ai écrit une commande comme celui-ci de mettre à jour une colonne dans une table avec avg de colonnes d'une autre table .. ses erreurs donnantmise à jour une colonne avec des données avg d'une autre colonne de table

UPDATE college_rating,products set 
property1_avg = avg(college_rating.rating1), 
property2_avg = avg(college_rating.rating2), 
property3_avg = avg(college_rating.rating3), 
property4_avg = avg(college_rating.rating4), 
property5_avg = avg(college_rating.rating5), 
property6_avg = avg(college_rating.rating6), 
property7_avg = avg(college_rating.rating7), 
property8_avg = avg(college_rating.rating8), 
property9_avg = avg(college_rating.rating9), 
property10_avg = avg(college_rating.rating10), 
property11_avg = avg(college_rating.rating11), 
property12_avg = avg(college_rating.rating12), 
property13_avg = avg(college_rating.rating13), 
property14_avg = avg(college_rating.rating14), 
property15_avg = avg(college_rating.rating15) 
where products.alias = concat(college_rating.property1,'-',college_rating.property2,'-',college_rating.property3) 
group by college_rating.property1,college_rating.property2, college_rating.property3 
+0

La lecture d'une telle requête SQL sur une seule ligne, il est un peu difficile à comprendre. Pouvez-vous le formater pour qu'il devienne plus lisible? –

Répondre

1

La syntaxe de mise à jour multi-table de MySQL ne permet pas l'utilisation de group by.

Vous pouvez accomplir ce que vous essayez de faire en déplaçant l'agrégation dans une sous-requête et en vous joignant à cette sous-requête dans la mise à jour multi-tables.

Quelque chose comme cela devrait fonctionner:

update products p 
inner join (
    select concat(property1,'-',property2,'-',property3) as alias, 
    avg(rating1) as property1_avg, 
    avg(rating2) as property2_avg, 
    avg(rating3) as property3_avg, 
    avg(rating4) as property4_avg, 
    avg(rating5) as property5_avg, 
    avg(rating6) as property6_avg, 
    avg(rating7) as property7_avg, 
    avg(rating8) as property8_avg, 
    avg(rating9) as property9_avg, 
    avg(rating10) as property10_avg, 
    avg(rating11) as property11_avg, 
    avg(rating12) as property12_avg, 
    avg(rating13) as property13_avg, 
    avg(rating14) as property14_avg, 
    avg(rating15) as property15_avg 
    from college_rating 
    group by property1,property2, property3 
) as r on r.alias = p.alias 
set p.property1_avg = r.property1_avg, 
p.property2_avg = r.property2_avg, 
p.property3_avg = r.property3_avg, 
p.property4_avg = r.property4_avg, 
p.property5_avg = r.property5_avg, 
p.property6_avg = r.property6_avg, 
p.property7_avg = r.property7_avg, 
p.property8_avg = r.property8_avg, 
p.property9_avg = r.property9_avg, 
p.property10_avg = r.property10_avg, 
p.property11_avg = r.property11_avg, 
p.property12_avg = r.property12_avg, 
p.property13_avg = r.property13_avg, 
p.property14_avg = r.property14_avg, 
p.property15_avg = r.property15_avg; 
+0

@lke Walker - non mec mec il n'a pas fonctionné ... 0 lignes effectuées. – Hacker

+0

Peut-être que votre inscription est erronée. Je ne peux pas le dire sans voir vos données. Mais vous pouvez essayer de faire un SELECT avec la même jointure. Si cela renvoie plus de 0 lignes, la mise à jour doit correspondre à plus de 0 lignes: 'select count (*) from college_rating les produits de jointure interne sur products.alias = concat (college_rating.property1, '-', college_rating.property2, '- ', college_rating.property3) ' –

0

Quelle est l'erreur vous obtenez? Et vous devez avoir une clause WHERE sauf si vous voulez que la requête UPDATE s'applique à TOUS les enregistrements

+0

l'erreur que j'obtiens est comme # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'group by college_rating.property1, college_rating.property2, college_rating.prope' à la ligne 18 – Hacker

+0

Veuillez poster votre déclaration SQL complète afin que moi et les autres puissent jeter un oeil et vous dire comment corriger les erreurs, s'il y en a :) –

0

Je pense que vous auriez besoin d'utiliser des sous-requêtes, et je ne suis pas sûr si vous pouvez mettre à jour deux tables comme ça dans MySQL, du moins pas sans préfixer les attributs.

Questions connexes