【问题标题】:Join - fields in table 2 override those in table 1连接 - 表 2 中的字段覆盖表 1 中的字段
【发布时间】:2011-07-10 11:26:14
【问题描述】:

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

产品
========== .
身份证
分号
说明
价格
安装时间

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

覆盖
========== .
经销商ID
分号
价格
安装时间

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

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

正如所写,这当然会出错。关键是我需要覆盖表中的价格(如果存在)而不是产品表中的价格(安装时间相同)。我可以使用不同的字段名称并将逻辑移至 PHP 层。但是SQL应该可以处理吧?

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    使用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 移动到连接谓词中,以检索 所有 产品以及特定经销商的覆盖。

    【讨论】:

    • 谢谢。这很好用。 IFNULL 和 COALESCE 之间有什么区别吗?查看 MySQL 文档,我看不出它们之间有很大的区别。
    • @skypanther 否,IFNULL 受 MySql 支持,COALESCE 是 ANSI 标准,所有 RDBMS 都支持。
    • 好吧,我确实把它标记为一个 mysql 问题,所以我会给你答案,虽然我想了很久把它交给 Tyler Eaves
    【解决方案2】:

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

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

    【讨论】:

    • 感谢@tyler-eaves 这与 Scrum Meister 的解决方案一样有效。我不确定将哪个设置为答案。我会等着看是否有人可以区分这两个功能......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2020-09-16
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多