2011-02-03 55 views
1

我有兩個產品表。表A是「默認」表(來自數據饋送每週自動更新)。表B用於手動覆蓋表A中的值,並且具有與表格相同的列以及幾個相同的列。兩個表總是具有相同的UniqueID列。使用另一個表覆蓋/加入MySQL表

我需要一個select語句,它從A中提取所有值,並從B中提取所有值,B覆蓋A中的值,除非B中的值爲null,=爲0或等於0.00(列設置爲整數帶2個小數點並填充「0」)。

我試過使用一個左連接,但我有null和「0」值的問題。

我正在使用php中的數據,可以處理它,當我只需要拉1行。我查詢每個,爲A提取assoc數組,過濾B數組然後提取它。但是當開始拉動20-200行時,這個過程變得非常笨重。

表A有大約400,000行,看不到B超過10,000-20,000。

感謝您的幫助。

更新:這是我得到的代碼工作。

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1 = 0, a.Price1, b.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

更新2:所以越簡單越好。 IF()地址都爲null和零。

IF(表達式1,表達式2,表達式3)

如果expr1 TRUE(expr1的<> 0且expr1的<> NULL),那麼如果()返回表達式2;否則它返回expr3。 IF()根據使用它的上下文返回一個數字或字符串值。

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1, b.Price1, a.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

回答

3

我想,這有啥可覆蓋所有的場景:

SELECT 
    COALESCE(b.nullablefield, a.nullablefield) as nullablefield, 
    IF(b.intfield = 0, a.intfield, b.intfield) as intfield, 
    IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield, 
    ... etc ... 
FROM table_a a 
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID 
+0

SELECT的UniqueID,COALESCE(b.Price1,a.Price1)的價格1,FROM productdata一個LEFT JOIN product_overrides b。在一.UniqueID = b.UniqueID WHERE UniqueID =「5676544」; 給我一個1064語法。如果我將*替換爲COALESCE,它就可以工作。 – EricImprint 2011-02-04 00:22:04