我有一个产品表,存储"主"定价:
产品
==========.
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到连接谓词,检索所有产品,以及特定经销商的替代.
将其作为左连接进行,然后在每个字段上使用合并,首先使用覆盖列。Coalesce 返回第一个非空参数。
select coalesce(overrides.partnum, products.partnum) ... etc.
Run Code Online (Sandbox Code Playgroud)