2009-05-07 15 views
1

ON DUPLICATE KEY UPDATEでIF文を選択することはできますか?ON DUPLICATE KEYでMySQLサブ選択

私は、郵便番号で配送料金を設定したいと言います。郵便番号が重複している場合は、最も高い料金を適用したいとします。

私のデータベースには送料と郵便番号のテーブルがあります。郵便番号表には、出荷レートを参照する外部キーと一意の索引を持つ郵便番号があります。

重複するキーがある場合は、送料率を高く設定したいと考えています。このような何か:私はこのクエリを実行しようとすると

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は「サブクエリが複数のレコードを返された」と言われます。 ShippingRatesテーブルに一致するレコードが1つしかないので、複数のレコードが返された方法はわかりません。実際に起こっているのは、サブ選択でShippingRateIDが常にShippingRatesテーブルを参照していて、挿入物のShippingRateIDが使用されていないということです。したがって、LIMITを使用しないと、すべての送料が返されます。私がLIMIT 1を使っているなら、私はいつも最初のレートを得るでしょう、それは間違っています。

Insertから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

私はあなたのアップデートをテストしましたが、それは適用可能な2つの料金のうち最高のものではなく、いつもそれを最も高い料金の料金に設定します。 なぜLIMITが必要なのか、WHERE句が1つの行にしかマッチできないことがわかりません。複数の行が一致する場合は、明らかにShippingRateIDがサブセレクトに正しく渡されていません。 – Yisroel

関連する問題