1

私は多くの同様の Web サイトで訪問者の動きを追跡しており、各目標にさまざまな値で追跡する目標を割り当てています。これらの目標は動的に作成されるため、動的に更新する必要もあります。mysql 構造の関連部分は次のとおりで、2 つのサイトで同じ 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);

上記の挿入コマンドは、site_id とともに次のような配列から作成されます。

$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 を追加し、各サイトの既存の目標の値と allow_multiple を更新したいと思います。

テーブルを切り捨てて、すべての値を最初から書き直すことを考えましたが、何千ものサイトがあります。また、replace、insert update で遊んで、最終的に髪を抜いてしまいました。

ロットを空にするより簡単な方法はありますか?

編集:最終結果は次のようになります

(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) を同時に追加するにはどうすればよいでしょうか?

4

3 に答える 3

0

OK、私はそれを理解しました、私はそれを2つの部分に分けました。

$s = "SELECT MAX(`idgoal`) AS slice FROM goals";    //4
$slice = 4;
$track_update = array_slice($config['trackings'], 0, $slice, true);

foreach($track_update as $id => $track){ //4 queries
    $s = "UPDATE `goals` SET `revenue` = ".$track['value'].",
            `allow_multiple` = ".$track['multi']." WHERE `idgoal` = '".$id."'";
}

//now to add new values
$s = "SELECT DISTINCT(`idsite`) AS mid FROM goals";     //array(10,13)
$result = array(10,13);

$track_add = array_slice($config['trackings'], $slice, count($config['trackings']), true);

foreach($track_add as $id => $track){  //1 query for each site
    foreach($result as $idsite){
        $sx[] = "(
                        ".$idsite.", ".$id.",
                        '".$track['name']."',
                        ".$track['multi'].",
                        ".$track['value']."
                    )";
    }

    $s = "INSERT INTO `goals`
            (`idsite`, `idgoal`, `name`, `allow_multiple`, `revenue`) 
            VALUES ".implode(',',$sx);
}

合計 5 つのクエリ:

UPDATE `goals` SET `revenue` = 6, `allow_multiple` = 0 WHERE `idgoal` = '1'
UPDATE `goals` SET `revenue` = 7, `allow_multiple` = 0 WHERE `idgoal` = '2'
UPDATE `goals` SET `revenue` = 8, `allow_multiple` = 1 WHERE `idgoal` = '3'
UPDATE `goals` SET `revenue` = 9, `allow_multiple` = 1 WHERE `idgoal` = '4'
INSERT INTO `goals` (`idsite`, `idgoal`, `name`, `allow_multiple`, `revenue`) 
VALUES 
(10, 5, 'MMP Details Video', 1, 10),
(13, 5, 'MMP Details Video', 1, 10);
于 2013-02-20T18:10:46.480 に答える