SQL ЕСЛИ существует дата за днем ​​делать инкрементное обновление или вставлять данные - PullRequest
0 голосов
/ 02 июня 2018

Как я могу выразить приведенный ниже оператор в виде запроса SQL?

IF EXISTS (SELECT * FROM expense_history 
           WHERE user_id = 40 
             AND DATE_FORMAT(expense_history.created_date , '%Y-%m-%d') = '2018-06-02' 
             AND camp_id='80') 
    UPDATE expense_history  
    SET clicks = clicks + 1, 
        amount = amount + 1 
    WHERE user_id = 40 
      AND DATE_FORMAT(expense_history.created_date, '%Y-%m-%d') = '2018-06-02' 
      AND camp_id = '80'
ELSE
   INSERT INTO expense_history (camp_id, created_date, amount, user_id) 
   VALUES ('80', '2018-06-02 12:12:12', '1', '40')
END IF;

Я просто хочу увеличивать количество кликов и количество, если оно установлено по дням, иначе я хочу добавить новую строку.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Это очень сложно в MySQL.Вы сохраняете datetime, но хотите, чтобы часть даты была уникальной.

Начиная с MySQL 5.7.?, Вы можете использовать вычисляемые столбцы для ограничения уникальности.Вот пример:

create table expense_history (
  user_id int,
  camp_id int,
  amount int default 0,
  clicks int default 1,
  . . .
  created_datetime datetime,  -- note I changed the name
  created_date date generated always as (date(created_datetime)),
  unique (user_id, camp_id, created_datetime)
);

Затем вы можете выполнить работу следующим образом:

INSERT INTO expense_history (camp_id, created_datetime, amount, user_id) 
    VALUES (80, '2018-06-02 12:12:12', 1, 40)
    ON DUPLICATE KEY UPDATE
        amount = COALESCE(amount + 1, 1),
        clicks = COALESCE(clicks + 1, 1);

Более ранние версии MySQL не поддерживают сгенерированные столбцы.Они также не поддерживают функции на unique.Но вы можете использовать трюк с индексом префикса на varchar, чтобы сделать то, что вы хотите:

create table expense_history (
  user_id int,
  camp_id int,
  amount int default 0,
  clicks int default 1,
  . . .
  created_datetime varchar(19), 
  unique (created_datetime(10))
);

Это имеет тот же эффект.

Другой альтернативой является сохранение даты и времени.в отдельных столбцах.

0 голосов
/ 02 июня 2018

Я предположил, что ваша база данных mysql из-за функции DATE_FORMAT () (и отредактировал ваш вопрос так, как он есть).

Итак, используя приведенный ниже механизм, вы можете делать то, что хотите,

при условии, что КОМПОЗИЦИОННЫЙ ПЕРВИЧНЫЙ КЛЮЧ для camp_id, amount, user_id столбцы:

SET @camp_id = 80,
    @amount  =  1,
    @user_id = 40,
    @created_date = sysdate();

INSERT INTO expense_history(camp_id,created_date,amount,user_id,clicks)
VALUES(@camp_id,@created_date,@amount,@user_id,ifnull(clicks,1))
ON DUPLICATE KEY UPDATE 
    amount = @amount + 1,
    clicks = ifnull(clicks,0)+1;

Демонстрация SQL Fiddle

...