2009-05-07 3 views
1

Возможно ли сделать выбор в выражении IF в ON DUPLICATE KEY UPDATE?MySQL Sub-select в ON DUPLICATE KEY

Скажем, я хочу установить тарифы доставки по почтовому индексу, а в случае ввода двойного почтового индекса я хочу применить самую высокую ставку для применения.

В моей базе данных есть таблица тарифов на доставку и таблица почтовых индексов. В таблице zip-кода имеется внешний ключ, указывающий скорость доставки, и почтовый индекс с уникальным индексом.

Если есть дубликат ключа, я хочу установить идентификатор скорости доставки для более высокой скорости. Что-то вроде этого:

INSERT INTO ZipCodes (ShippingRateID, Zip) VALUES (11, '13754') ON DUPLICATE KEY UPDATE ShippingRateID = IF((SELECT Rate FROM ShippingRates sr WHERE sr.ShippingRateID = ShippingRateID) > [current rate], ShippingRateID, VALUES(ShippingRateID))

Когда я пытаюсь выполнить этот запрос, MySQL говорит мне «Subquery вернулся более одной записи». Поскольку в таблице ShippingRates имеется только одна соответствующая запись, я не понимаю, как было возвращено более одной записи. На самом деле происходит то, что в подвыборке ShippingRateID всегда ссылается на таблицу ShippingRates, а значение ShippingRateID вставки не используется. Поэтому, не используя LIMIT, все тарифы доставки возвращаются. Если я использую LIMIT 1, тогда я всегда буду получать первую ставку, что неверно.

Как указать суб-выбор использовать ShippingRateID из вставки?

ответ

2
INSERT INTO ZipCodes 
(ShippingRateID, Zip) 
VALUES (11, '13754') 
ON DUPLICATE KEY 
UPDATE ShippingRateID = 
    (SELECT IF(Rate > [current rate], ShippingRateID, VALUES(ShippingRateID)) 
     FROM (
      SELECT ShippingRateID AS AltID, Rate 
      FROM ShippingRates 
     ) AS sr 
     WHERE sr.AltID = ShippingRateID 
     LIMIT 1 
    ) 
+0

Как ваше обновление отличается от моего? – Yisroel

+0

Он защищает от (бессмысленной) проблемы с несколькими рядами и позволяет извлекать значение ShippingRateID из таблицы. – chaos

+0

Я проверил ваше обновление, оно всегда будет устанавливать максимальную скорость любого из тарифов на доставку, а не самую высокую из двух ставок, которые могут применяться. Я не понимаю, зачем нужен LIMIT вообще, когда предложение WHERE может соответствовать только одной строке. Если он соответствует нескольким строкам, то ясно, что ShippingRateID не будет правильно передан в подвыборку. – Yisroel