是否可以在ON DUPLICATE KEY UPDATE中的IF语句中进行选择?
假设我想通过邮政编码设置运费,如果输入重复的邮政编码,我想申请最高费率。
我的数据库有一个运费表和一个邮政编码表。邮政编码表具有引用运费的外键,以及具有唯一索引的邮政编码。
如果有重复的密钥,我想将运费率ID设置为更高的费率。像这样:
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?
答案 0 :(得分: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
)