在mysql中对多个用户自己的记录执行计算

时间:2012-04-03 01:04:09

标签: php mysql stored-procedures

我需要帮助扩展功能更新查询,该查询在一条记录上执行计算,以便不仅可以在数据库中的一条记录上执行计算,还可以在与特定用户#相关联的所有记录上执行计算。

从功能上讲,我需要扩展“编辑此记录”以“重新评估用户#的所有记录”。

当前计算使用3个表,对一列求和,除以另一个的总和,然后从该结果创建一个变量(有两列分别求和以创建两个变量)。然后我有一个简单的UPDATE查询来使用这些变量的值更新记录。每条记录都有不同的值,每个id的总和都不同# @lastid是唯一的记录ID。(allinfsds.id1) 我需要对所有特定所有者ID(allinfsds.own_id)的记录进行计算[即。 all allfsfs.own_id = usernum ]

任何想法??? 提前谢谢, 纳特

    CREATE TABLE `allingred` (
  `id6` int(8) NOT NULL auto_increment,
  `usernum` varchar(255) default NULL,
  `fsdsnum` int(8) unsigned zerofill NOT NULL,
  `mfdfsds` varchar(255) default NULL,
  `maybe` decimal(2,1) NOT NULL default '1.0',
  `amount` float(10,2) default NULL,
  `unit` int(6) default NULL,
  `name` varchar(255) default NULL,
  `wgt` int(9) NOT NULL,
  PRIMARY KEY  (`id6`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=38 ;

    CREATE TABLE `weight` (
  `NDB_No2` int(8) unsigned zerofill NOT NULL,
  `Seq` smallint(6) NOT NULL,
  `amt2` decimal(5,3) NOT NULL,
  `Msre_Desc` varchar(80) NOT NULL,
  `Gm_Wgt` decimal(7,1) NOT NULL,
  `Num_Data_Pts` tinyint(4) default NULL,
  `Std_Dev` decimal(7,1) default NULL,
  `uni` int(7) NOT NULL auto_increment,
  PRIMARY KEY  (`uni`),
  KEY `fb_join_NDB_No2_INDEX` (`NDB_No2`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21731 ;

    CREATE TABLE `allinnot2` (
  `NDB_No` int(8) unsigned zerofill NOT NULL,
  `Water` decimal(10,2) default NULL,
  `Energ_Kcal` decimal(10,0) default NULL

    CREATE TABLE `allinfsds` (
  `id1` int(8) unsigned zerofill NOT NULL,
  `own_id` int(11) NOT NULL
  UNIQUE KEY `id` (`id1`),
  KEY `fb_groupbyorder_item_number_INDEX` (`item_number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


    SET @cal = (SELECT SUM( Energ_Kcal * allingred.amount * Gm_Wgt) / SUM( allingred.amount * Gm_Wgt ) AS nut100
FROM  `allingred` 
LEFT JOIN weight ON allingred.unit = weight.uni
LEFT JOIN allinnot2 ON allingred.mfdfsds = allinnot2.NDB_No
LEFT JOIN allinfsds ON allingred.fsdsnum = allinfsds.own_id
WHERE fsdsnum = @lastid)

SET @prot = (SELECT SUM(Protein * allingred.amount * Gm_Wgt) / SUM( allingred.amount * Gm_Wgt ) AS nut100
FROM  `allingred` 
LEFT JOIN weight ON allingred.unit = weight.uni
LEFT JOIN allinnot2 ON allingred.mfdfsds = allinnot2.NDB_No
WHERE fsdsnum = @lastid)

UPDATE `allinnot2` SET
  `Energ_Kcal` = @cal,
  `Protein` = @prot
WHERE `NDB_No` = @lastid

1 个答案:

答案 0 :(得分:1)

如何一次更新多个元组

如果您有要更新的ID列表,请使用

UPDATE `myTable` SET `myColumn` = 'newValue' 
WHERE `userId` IN (
    /*list of relevant Ids for instance: */ 15, 20, 63, 987
)

或者如果您没有此列表,但您可以在数据库中查询此列表,请使用

UPDATE `myTable` SET `myColumn` = 'newValue' 
WHERE `userId` IN (
    SELECT `userId` FROM `myOtherTable` WHERE `relevantColumn` = 'value'
)

请注意,不允许您在子选择中使用与更新目标和ID来源相同的表格,因此myTable!= myOtherTable