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

sky*_*her 6 mysql join

我有一个产品表,存储"主"定价:

产品
==========.
id
partnum
描述
价格
安装时间

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

覆盖
==========.
dealerID
partnum
price
installtime

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

SELECT partnum, price, installtime FROM products  
JOIN overrides ON products.partnum = overrides.partnum  
WHERE dealerID = 123
Run Code Online (Sandbox Code Playgroud)

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

The*_*ter 12

使用LEFT JOINwith with IFNULL首先检查覆盖,如果不存在覆盖,则使用fallback.

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  
Run Code Online (Sandbox Code Playgroud)

注意:我移动WHERE dealerID = 123到连接谓词,检索所有产品,以及特定经销商的替代.


Tyl*_*ves 5

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

select coalesce(overrides.partnum, products.partnum) ... etc.
Run Code Online (Sandbox Code Playgroud)