2013-12-22 2 views
1

Можно ли подключить дубликат ключа к другому оператору. Я только что выбрал целые числа (4=4) для примера. В коде активации я пытаюсь сравнить две даты и только если дата в строке базы данных больше, чем дата сгенерированного php и дублированный ключ, она должна обновить unj до 7.PHP - MYSQL - вставить на дубликат ключа AND (?)

от этого:

$sql="INSERT INTO mutable (hid, xsn, unj, for, datetime) 
VALUES ('$hid', '$xsn', '$unj', '$for', now()) ON DUPLICATE KEY UPDATE unj=7"; 

к этому:

$sql="INSERT INTO mutable (hid, xsn, unj, for, datetime) 
VALUES ('$hid', '$xsn', '$unj', '$for', now()) ON 4=4 AND DUPLICATE KEY UPDATE unj=7"; 

(4 = 4 и) добавлен.

Но это не работает. Есть ли способ архивировать это?

спасибо.

Редактировать: Я знаю, что могу архивировать это с помощью SELECT, а затем INPUT или UPDATE, но мне нужен более эффективный код.

+0

Вы искали, как сравнивать даты в SQL? –

+0

Я не думаю, что вы можете сделать что-нибудь подобное; 'ON DUPLICATE KEY UPDATE' - это особый синтаксис. Какова ваша цель? –

+2

@JustinWood Это не о датах, а о выражении SQL и о том, как использовать 'on duplicate key' с другим значением. Я заменил даты на' 4 = 4', чтобы упростить вопрос. – Kallewallex

ответ

6
INSERT INTO mutable (hid, xsn, unj, `for`, datetime) 
VALUES ('$hid', '$xsn', '$unj', '$for', now()) 
ON DUPLICATE KEY UPDATE unj = IF(datetime > VALUES(datetime), 7, unj) 

Я тестировал это, и он работает.

VALUES(datetime) ссылается на значение, которое вы использовали . для ввода в колонку datetime. Это удобный способ повторить значение в вашем предложении ON DUPLICATE KEY UPDATE без необходимости повторять его дважды в запросе.

Если условие в IF() возвращает false, то по умолчанию установлено значение unj = unj, что означает отсутствие операции.

PS: for является MySQL reserved word, поэтому его необходимо разграничить. Было бы проще избежать этого имени столбца.

+1

Красивые. Оно работает. Я знал, что есть более эффективный способ, чем использование SEL + INS/UPD. ** Большое спасибо. ** PS: Мой столбец не назван «для». Я просто сделал все эти ценности и варры, потому что я не уверен в своем контракте и информации, которую мне разрешено передавать. – Kallewallex

+0

Есть ли способ заменить дату ('datetime') на datetime из другой таблицы? например 'IF (mutable2x.datetime> VALUES (datetime), 7, uni)' – Kallewallex

+0

@Kallewallex, вы можете использовать скалярный подзапрос, но я его не тестировал. И это, по крайней мере, будет противодействовать вашей цели - сделать эффективный запрос. :-) –

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