2012-04-03 42 views
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 

回答

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

+0

啊,我明白了,我的问题还不清楚。在我上面的查询中,当我说'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

+0

没关系,我感到困惑,你的回答很明确,我正在学习很多!我修改我的查询是这样的: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

+0

是你不能选择要更新的表的东西。你可以使用一个[临时表](https://dev.mysql.com/doc/refman/5.1/en/create-table.html)。 – Basti 2012-04-30 07:13:26