坚持INSERT INTO在DUPLICATE KEY UPDATE

时间:2015-03-05 04:20:41

标签: php mysql

我有以下查询:

INSERT INTO `impressions` (`date`, `item_id`, `platform`, `country`) VALUES ('" . $date . "', '" . $item_id . "', '" . $platform . "', '" . $country . "') ON DUPLICATE KEY UPDATE `impressions` = `impressions` + 1

以下数组:

Array
(
    [0] => 5
    [1] => 2
    [2] => 4
    [3] => 17
)

该数组基本上由item_ids组成,我想将其插入/更新到数据库中。

当查询运行时,我希望它检查是否有来自以下的行:今天,匹配指定的item_id,匹配指定的平台并匹配指定的国家。

例如:

2015-03-05 5 mobile US (new insert)
2015-03-05 2 mobile UK (new insert)
2015-03-05 5 mobile US (this would +1 impression from first one)
2015-03-05 17 desktop US (new insert)
2015-03-06 5 mobile US (this would create a new insert because the date doesn't exist)

我还想使用IN传递一个item_id数组,如上所述,以避免多次循环。

目前我们正在这样做:

$item_ids = array('5', '2', '4', '17');

foreach($item_ids as $id){
    $q = mysql_query("SELECT `id` FROM `impressions` WHERE `date` = '" . $date . "' AND `item_id` = '" . $id . "' AND `platform` = '" . $platform . "' AND `country` = '" . $country . "'");

    if (mysql_num_rows($q)){
        $r = mysql_fetch_array($q);
        mysql_query("UPDATE `impressions` SET `impressions` = `impressions` + '1' WHERE `id` = '" . $r['id'] . "'");
    } else {
        mysql_query("INSERT INTO `impressions` (`date`, `item_id`, `platform`, `country`, `impressions`) VALUES('" . $date . "', '" . $id . "', '" . $platform . "', '" . $country . "', '1') ");
    }
}

我们基本上想要将这个巨大的(并且编码错误的)循环转换为1个mySQL INSERT / UPDATE查询,该查询将传递一个与IN一起使用的item_ids数组。

我真的很困惑,我应该如何处理这个问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

UPDATE impressions = impressions + 1

需要

UPDATE impressions = VALUES(impressions) + 1

答案 1 :(得分:1)

INSERT INTO `impressions` (
    `date`, 
    `item_id`, 
    `platform`, 
    `country`, 
    `impressions`
    ) 
VALUES ( 
    '{$date}', 
    {$id}, 
    '{$platform}', 
    '{$country}', '1')
ON DUPLICATE KEY 
UPDATE `impressions` = VALUES(impressions) + 1

要使其工作,请确保表格展示次数有一个要检查的主键。

以便在重复键上更新它