0
我需要帮助扩展功能更新查询,该查询在一个记录上执行计算,以便不仅可以对数据库中的一条记录执行计算,而且可以对与特定关联的所有记录用户#。对mysql中的多个用户自己的记录执行计算
功能上,我需要扩展一个“编辑此记录”为“重新评估用户#的所有记录?”。
当前的计算利用3个表格,总计一列,除以另一个的总和,然后从该结果创建一个变量(有两列分别合并以创建两个变量)。然后我有一个简单的UPDATE查询来更新记录与这些变量的值。每个记录具有不同的值,并且每个ID的总和将不同# @lastid是唯一的记录ID(allinfsds.id1) 我需要对所有记录=特定所有者ID(allinfsds。 own_id)[即WHERE allinfsds.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
啊,我明白了,我的问题还不清楚。在我上面的查询中,当我说'WHERE fsdsnum = @lastid'时,我没有引用userids,而是行id,这对每个userid都有很多。所以,我现在做的是选择一行ID A,它与其他记录(如1,2,4,5)有一对多关系,对这些相关记录的总和进行计算,然后插入该值到行ID A.我需要做的是对属于特定用户标识(WHERE USER ID IN'546')的所有记录(例如A,C,R,Z,X)执行相同的操作,但是分开。 – Nat 2012-04-19 22:57:51
没关系,我感到困惑,你的回答很明确,我正在学习很多!我修改我的查询是这样的:UPDATE aallinnot2 c SET c.Energ_Kcal =(SELECT SUM(c.Energ_Kcal) FROM aaingred a LEFT JOIN aaweight b ON a.unit = b.uni LEFT JOIN aallinnot2 c ON a.mfdfsds = c.NDB_No LEFT JOIN aalinfsds d ON a.fsdsnum = d.id1 WHERE d.own_id = 42 GROUP BY ID1) WHERE c.NDB_No IN(SELECT DISTINCT'fsdsnum' FROM'aaingred' WHERE' usernum' LIKE“42” ),但我得到一个错误“#1093 - 您不能指定目标表‘C’的更新在FROM子句” – Nat 2012-04-26 18:11:03
是你不能选择要更新的表的东西。你可以使用一个[临时表](https://dev.mysql.com/doc/refman/5.1/en/create-table.html)。 – Basti 2012-04-30 07:13:26