2013-02-20 30 views
1

我正在跟蹤訪問者在許多類似網站上的移動,並且已經爲每個目標分配了跟蹤各種值的目標。由於這些目標是動態創建的,我還需要動態更新它們。 mysql結構的相關部分如下所示,它描述了2個站點上相同的4個目標。 注意:每個網站的目標總是相同的。MySQL的更新或插入取決於ID的存在

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每個網站現有的目標。

我想過要截斷表並重寫所有的值從頭開始,但有成千上萬的網站。 我也玩過替換,插入更新,並最終拉出我的頭髮。

有沒有更簡單的方法來做到這一點,然後清空很多?

編輯: 最終的結果是這樣的

(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)同時?

回答

1

你有所有站點的表?如果是的話,你可以使用REPLACE這樣的:

REPLACE INTO goals (idsite, idgoal, name, allow_multiple, revenue) 
SELECT idsite, 5, 'MMP Details Video', 1, 10 FROM sites; 

這裏sites是有含義idsite列在表goals同一列idsite所有站點的表格。

此語句插入新記錄插入goals表用於sites表值idside, 5, 'MMP Details Video', 1, 10,其中idsite是從sites表的idsite塔中取出的值來定義每個站點。如果已經存在與idsiteidgoal相同的記錄,則將其替換爲新記錄。

+0

輝煌,測試和工作就像一個魅力!我從來不知道我可以使用字符串作爲那樣的選擇。非常感謝你! – 2013-02-20 18:29:03

+0

@AndyGee你好! – 2013-02-20 18:36:32

1

您有幾種選擇:

使用INSERT IGNORE INTO table

INSERT … ON DUPLICATE KEY UPDATE

請查看MySQL的文檔對兩個命令的詳細信息

+0

是的,我一直在嘗試一段時間,你能提供一個簡單的例子嗎? – 2013-02-20 17:24:20

+0

INSERT INTO目標(id,revenue,allow_multiple,...)VALUES($ id,'blah','blah',...)關於重複密鑰更新 – Husman 2013-02-20 17:39:09

+0

INSERT INTO goals(idsite,idgoal,revenue, allow_multiple)VALUES(10,4,44,0)ON DUPLICATE KEY UPDATE' =#1064 - 你的SQL語法有錯誤 – 2013-02-20 17:52:09

0

好了,我想通了,我把它分成兩部分。

$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); 
相關問題