I'm running mysql 4.1.7.

For the sake of this message I have created this tables:

CREATE TABLE `log` (
`ID` int(11) NOT NULL auto_increment,
`Cod_P` varchar(5) NOT NULL default '',
`Import` double NOT NULL default '0',
PRIMARY KEY  (`ID`)
) ENGINE=MyISAM;

CREATE TABLE `master` (
`Cod_P` varchar(5) NOT NULL default '',
`Total` double NOT NULL default '0',
PRIMARY KEY  (`Cod_P`)
) ENGINE=MyISAM;
I want master.Total to hold a sum of log.Import for every Cod_P

In Microsoft Sql Server I have run:

update master
set Total = TotalImport
from ( select sum(Import) TotalImport, log.Cod_P from master inner join log
      on (master.Cod_P=log.Cod_P)
      group by log.Cod_P) t
where master.Cod_P = t.Cod_P

which, IMHO, is a clean way to do this.

in mysql I get a syntax error.

I tried

update `master`,`log`
set Total =  Total + Import
where  `master`.Cod_P=`log`.Cod_P

but this only put in master table the value of just one row of every Cod_P in log table.

this way it works

update `master`
set Total = (select sum(Import) from `log` where `master`.Cod_P=`log`.Cod_P)

but I get 1 warning (I don't know what warning) and I deem this way inefficient in case I have to summarize several columns. I would need to write

update `master`
set Total = (select sum(Import) from `log` where `master`.Cod_P=`log`.Cod_P), set Total1 = (select sum(Import1) from `log` where `master`.Cod_P=`log`.Cod_P), set Total2 = (select sum(Import2) from `log` where `master`.Cod_P=`log`.Cod_P), set Total3 = (select sum(Import3) from `log` where `master`.Cod_P=`log`.Cod_P), set Total4 = (select sum(Import4) from `log` where `master`.Cod_P=`log`.Cod_P), set Total5 = (select sum(Import5) from `log` where `master`.Cod_P=`log`.Cod_P), set Total6 = (select sum(Import6) from `log` where `master`.Cod_P=`log`.Cod_P)

while in Sql Server it would look something like:

update master
set Total = TotalImport,Total1 = TotalImport1,Total2 = TotalImport2,Total3 = TotalImport3,Total4 = TotalImport4,Total5 = TotalImport5,Total6 = TotalImport6 from ( select sum(Import) TotalImport,sum(Import1) TotalImport1,sum(Import2) TotalImport2,sum(Import3) TotalImport3,sum(Import4) TotalImport4,sum(Import5) TotalImport5,sum(Import6) TotalImport6, log.Cod_P from master inner join log
       on (master.Cod_P=log.Cod_P)
       group by log.Cod_P) t
where master.Cod_P = t.Cod_P

with only one subselect to put your eyes on (and to debug just in case).

In an example I run, I think mysql fired every one subselect while sql server do all the work with just one round (it was just one quick test, so I cannot be sure)

Maybe I'm overlooking something.
Is there anyone out there with a better mysql syntax to accomplish this?

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to