2011-03-07 25 views
6

我有一個產品表,用於存儲 「主」 定價:加入 - 在表2覆蓋項與表1

產品
==========。
ID
partnum
描述
價格
installtime

經銷商可以覆蓋標價,設置不同的價格,安裝時間,等我的想法是存儲在另一個表中的特定經銷商,差異:

覆蓋
========= =。
dealerID
partnum
價格
installtime

當我查詢經銷商的價格分貝,我需要加入這些表。我需要覆蓋表中的值來覆蓋產品表中的值。

SELECT partnum, price, installtime FROM products 
JOIN overrides ON products.partnum = overrides.partnum 
WHERE dealerID = 123 

正如所寫的,這當然會給出錯誤。重點是我需要覆蓋表中的價格(如果存在的話)而不是產品表中的價格(與安裝時相同)。我可以使用不同的字段名稱並將邏輯移動到PHP層。但是SQL應該能夠處理它,對吧?

回答

12

使用LEFT JOINIFNULL一起首先檢查覆蓋,如果不存在覆蓋,則使用後退。

SELECT p.partnum, 
    IFNULL(d.price, p.price) AS price, 
    IFNULL(d.installtime, p.installtime) AS installtime 
FROM products p 
    LEFT JOIN overrides d ON d.dealerID = 123 
     AND p.partnum = d.partnum 

注:我搬到了WHERE dealerID = 123到連接謂詞,檢索所有產品,以及覆蓋特定經銷商。

+0

謝謝。這工作很好。 IFNULL和COALESCE有什麼不同?看看MySQL文檔,我沒有看到它們之間的巨大差異。 – skypanther 2011-03-07 21:47:38

+1

@skypanther否,'IFNULL'由MySql支持,'COALESCE'是ANSI標準並且受所有RDBMS支持。 – 2011-03-07 21:53:23

+0

好吧,我確實把這個標記爲一個mysql問題,所以我會給你答案,儘管我想了很久才把它交給了Tyler Eaves – skypanther 2011-03-08 18:25:59

3

將它作爲左連接,然後在每個字段上使用合併,並使用override列。 合併返回第一個非空參數。

select coalesce(overrides.partnum, products.partnum) ... etc. 
+0

Thanks @ tyler-eaves這和Scrum Meister的解決方案一樣。我不確定要設置哪個答案。我會拭目以待,看看有沒有人能夠區分這兩種功能...... – skypanther 2011-03-07 21:49:14