Join - 表2中的字段覆盖表1中的字段

时间:2011-03-07 16:22:06

标签: mysql join

我有一个存储“主”定价的产品表:

  

产品
  ==========   ID
  partnum
  说明
  价格
  安装时间

经销商可以覆盖定价,设定不同的价格,安装时间等。我的想法是将经销商特定的差异存储在另一个表中:

  

覆盖
  ==========   dealerID
  partnum
  价格
  安装时间

当我查询数据库中的经销商价格时,我需要加入这些表格。我需要覆盖表中的值来覆盖products表中的值。

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

如上所述,这当然会产生错误。关键是我需要覆盖表中的价格(如果存在而不是product表中的价格)(安装时相同)。我可以使用不同的字段名称并将逻辑移动到PHP层。但SQL应该能够处理它,对吗?

2 个答案:

答案 0 :(得分: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移至联接谓词,以检索所有产品以及特定经销商的替代。

答案 1 :(得分:4)

将其作为左连接执行,然后在每个字段上使用coalesce,首先使用覆盖列。 Coalesce返回第一个非null参数。

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