我有一个存储“主”定价的产品表:
产品
========== ID
partnum
说明
价格
安装时间
经销商可以覆盖定价,设定不同的价格,安装时间等。我的想法是将经销商特定的差异存储在另一个表中:
覆盖
========== dealerID
partnum
价格
安装时间
当我查询数据库中的经销商价格时,我需要加入这些表格。我需要覆盖表中的值来覆盖products表中的值。
SELECT partnum, price, installtime FROM products
JOIN overrides ON products.partnum = overrides.partnum
WHERE dealerID = 123
如上所述,这当然会产生错误。关键是我需要覆盖表中的价格(如果存在而不是product表中的价格)(安装时相同)。我可以使用不同的字段名称并将逻辑移动到PHP层。但SQL应该能够处理它,对吗?
答案 0 :(得分:12)
使用LEFT JOIN
和IFNULL
一起检查覆盖,如果不存在覆盖则使用后备。
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.