我正在一些类似的网站上跟踪访问者的动向,并为每个目标分配了不同的跟踪值。由于这些目标是动态创建的,我还需要动态更新它们。
mysql结构的相关部分如下,它在两个站点上描述了相同的4个目标。
注意:每个站点的目标都是一样的。
CREATE TABLE IF NOT EXISTS `goals` (
`idsite` int(11) NOT NULL,
`idgoal` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`allow_multiple` tinyint(4) NOT NULL,
`revenue` float NOT NULL,
PRIMARY KEY (`idsite`,`idgoal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `goals` (`idsite`, `idgoal`, `name`, `allow_multiple`, `revenue`) VALUES
(10, 1, 'Product Benefits Video', 0, 2),
(10, 2, 'Agent Benefits Video', 0, 4),
(10, 3, 'Social Network Video', 0, 6),
(10, 4, 'MMP Overview Video', 1, 8),
(13, 1, 'Product Benefits Video', 0, 2),
(13, 2, 'Agent Benefits Video', 0, 4),
(13, 3, 'Social Network Video', 0, 6),
(13, 4, 'MMP Overview Video', 1, 8);
上面的insert命令是从一个数组创建的,与site\u id一起作为follows。
$config['trackings'][1] = array('name'=>'Product Benefits Video', 'value'=>'2', 'multi'=>'0');
$config['trackings'][2] = array('name'=>'Agent Benefits Video', 'value'=>'3', 'multi'=>'0');
$config['trackings'][3] = array('name'=>'Social Network Video', 'value'=>'4', 'multi'=>'0');
$config['trackings'][4] = array('name'=>'MMP Overview Video', 'value'=>'5', 'multi'=>'1');
我将永远不需要删除一个目标,但我想知道如何改变价值,如果目标不存在,把它添加到所有的网站。
例如,如果我提供一个新数组,如下所示:
$config['trackings'][1] = array('name'=>'Product Benefits Video', 'value'=>'6', 'multi'=>'0');
$config['trackings'][2] = array('name'=>'Agent Benefits Video', 'value'=>'7', 'multi'=>'0');
$config['trackings'][3] = array('name'=>'Social Network Video', 'value'=>'8', 'multi'=>'1');
$config['trackings'][4] = array('name'=>'MMP Overview Video', 'value'=>'9', 'multi'=>'1');
$config['trackings'][5] = array('name'=>'MMP Details Video', 'value'=>'10', 'multi'=>'1');
我想添加目标5,并更新每个站点的现有目标的值和允许数。
我考虑过从零开始截断表并重写所有值,但是有成千上万个站点。
我也玩过替换,插入更新,最后拔出我的头发。
有没有一个更简单的方法可以做到这一点,然后清空地段?
编辑:
最终的结果是这样的
(10, 1, 'Product Benefits Video', 0, 6),
(10, 2, 'Agent Benefits Video', 0, 7),
(10, 3, 'Social Network Video', 1, 8),
(10, 4, 'MMP Overview Video', 1, 9),
(10, 5, 'MMP Details Video', 1, 10),
(13, 1, 'Product Benefits Video', 0, 6),
(13, 2, 'Agent Benefits Video', 0, 7),
(13, 3, 'Social Network Video', 1, 8),
(13, 4, 'MMP Overview Video', 1, 9);
(13, 5, 'MMP Details Video', 1, 10);
编辑:这将很容易完成所有更新
foreach($config['trackings'] as $id => $track)
{
$s = "UPDATE `goals` SET `revenue` = ".$track['value'].", `allow_multiple` = ".$track['multi']." WHERE `idgoal` = '".$id."'";
}
但是,如何同时添加丢失的目标(5)?
最佳答案
你有所有网站的列表吗?如果是,您可以这样使用REPLACE
:
REPLACE INTO goals (idsite, idgoal, name, allow_multiple, revenue)
SELECT idsite, 5, 'MMP Details Video', 1, 10 FROM sites;
这里的
sites
是一个包含列idsite
的所有站点的表,其含义与表idsite
中的列goals
相同。此语句将值为
goals
的sites
表中定义的每个站点的新记录插入idside, 5, 'MMP Details Video', 1, 10
表中,其中idsite
是从idsite
表的sites
列中获取的值。如果具有相同的idsite
和idgoal
的记录已经存在,则替换为新的记录。