2015-03-05 7 views
-1

У меня есть следующий запрос:Застрял с INSERT INTO дублированием KEY UPDATE

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) 

Я также хочу, чтобы передать массив item_ids, как указано выше, с использованием IN, чтобы избежать многократного зацикливания.

Сейчас мы сейчас делаем это следующим образом:

$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 запрос, который получает передается массив item_ids в использовать с IN.

Я действительно смущен, как я должен подходить к этому. Любая помощь будет принята с благодарностью.

ответ

1

UPDATE impressions = impressions + 1

должен быть

UPDATE impressions = VALUES(impressions) + 1

+0

С этим исправлением он будет достичь того, чего я стремлюсь? –

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

для этой работы, следить за тем, что впечатления таблица имеет первичный ключ, чтобы проверить с.

так, что на дубликата ключа будет обновлять его

+0

Спасибо за это, я проверю его. Как мы можем добавить к нему IN, чтобы он делал это для всех элементов ids, а не зацикливал через foreach? –

+0

Я использую это, я также создал уникальный ключ для вставки/обновления, который есть: '$ key = sha1 (date ('Ym-d', time()). $ Item ['id']. $ platform. $ country); '- он вставляет первый раз, обновляя второй раз, но когда показы достигают 2, он больше не обновляется. –

+0

@KyleR; извините, его обновление, потому что значение, которое он использует, всегда 1, а не последнее значение в показах. показов при запуске запроса. вам нужно получить последнее значение показов и поместить его в значения значений; надеюсь, что вы получите то, что я имею в виду –

Смежные вопросы