我有以下查询:
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数组。
我真的很困惑,我应该如何处理这个问题。任何帮助将不胜感激。
答案 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
要使其工作,请确保表格展示次数有一个要检查的主键。
以便在重复键上更新它