2012-12-06 3 views
0

У меня есть две таблицы:базы данных MySQL, связанные с

purchase_mis(id, user_id, total_purchased, date) 
daily_purchase(id, user_id, product_id, paid_amount, purchase_date) 

У меня есть файл CRON, который работает каждую ночь, он считает ежедневную покупку от "daily_purchase" стола и бежит insert into "purchase_mis".

Например:

SELECT 
    COUNT(*) AS purchase_count, 
    purchase_date 
FROM daily_purchase 
GROUP BY user_id; 

Это возвращает purchase_count для каждого пользователя, а затем он будет вставлен в "purchase_mis" таблице.

INSERT INTO 
    purchase_mis(user_id, total_purchased, date) 
VALUES 
    ('2', 'purchase_count', 'purchase_date'); 

Но перед установкой, он должен проверить, если приобретенная информация user_id = 2 на какой-то даты «purchase_date» уже вставлен, так что не следует вставить снова.


Я хочу что-то вроде ниже запроса:

INSERT INTO 
    purchase_mis(user_id, total_purchased, date) 
VALUES 
    ('2', 'purchase_count', 'purchase_date') 
WHERE date NOT EXISTS (SELECT date FROM purchase_mis WHERE user_id = '2'); 
+0

Не используйте символьные литералы для чисел. ''2'' является символом, а не числом. Если 'user_id' определяется как, например, целое число, вы должны использовать '2' - никаких одинарных кавычек вокруг значения. –

ответ

3

Создать ключ в столбце даты, а затем использовать INSERT IGNORE или INSERT ... ON DUPLICATE KEY UPDATE синтаксис. См. Это для более: "INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"

Кроме того, вы можете использовать триггеры или процедуры вместо задания cron; может сделать жизнь немного легче.

+1

Я думаю, что триггеры являются подходящей техникой –

+0

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

+0

@XiKam: как насчет процедур? – cegfault

0
insert into purchase_mis 
    (user_id, total_purchased, date) 
select * 
from (
    select 2 as id, 
      100 as user_id, 
      str_to_date('2012-12-04', '%Y-%m-%d') as purchase_date 
) t 
where not exists (SELECT 1 
        FROM purchase_mis pm 
        WHERE pm.user_id = t.id 
        and pm.date = t.purchase_date); 
Смежные вопросы