【问题标题】:Three Joins fields in table 2 override those in table 1表 2 中的三个 Joins 字段覆盖了表 1 中的字段
【发布时间】:2018-01-02 14:20:37
【问题描述】:

用户创造新客户。客户拥有产品订阅。

user
========
user_id
name

customer
========
customer_id
user_id
name

subscription
========
customer_id
product_id

我有一个产品表,其中存储所有用户的“主”定价:

product
========
product_id
name
price

但我可以为某些用户覆盖部分或全部产品的价格。

user_price
========
product_id
user_id
price

我正在为需要产品价格/覆盖价格的表订阅编写触发器。由于覆盖的价格基于 user_id 但我没有将 user_id 存储在此表中,我如何编写一个语句,根据为此订阅设置的 customer_id 从客户表中检索 user_id 然后检索正确的价格?

SELECT `price`
FROM `product` p
LEFT JOIN `user_price` u
    ON u.`user_id` = ???? AND u.`product_id` = NEW.product_id
INTO var_product_price;

我的设计效率如何?我应该保持这样还是开始将 user_id 存储在订阅中。 ?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您可以通过多种方式执行此操作,具体取决于您的数据库支持的内容。 case 语句会更灵活,但您也可以使用 ISNULL 函数,该函数应该非常便携。

    SELECT u.Name [UserName], c.Name [CustomerName], p.Name [Product Name]
    , isnull(up.price, p.price) [User or Product Price]
    from user u
    join customer c on u.user_id = c.user_id
    join subscription s on c.customer_id = s.customer_id
    left join user_price up on s.product_id = up.product_id and u.user_id =     up.user_id
    

    【讨论】:

    • 谢谢。我的设计效率如何?我是否应该在订阅上加注存储 user_id 也是多余但更快?
    • 它总是归结为记录和索引的数量。你有一个很好的设计,如果曾经有一个公司可以有多个订阅的情况,你只需要将 user_id 放在订阅中。在大多数情况下,额外的连接可以忽略不计。现在告诉我用户表在远程数据库中,或者它有数百万条记录并且没有被 user_id 索引。您总能找到一种方法来降低原本不错的设计工作效率。
    【解决方案2】:

    您从订阅表开始,然后加入客户,然后加入 user_price。

    -- you start with subscription and have customer_id and product_id from there
    SELECT COALESCE(u.price, p.price) AS final_price
    
    FROM product p
    JOIN customer c 
    LEFT JOIN user_price u ON u.user_id = c.user_id
    
    WHERE p.product_id = '123' AND c.customer_id = 'ABC'
    

    由于您必须有此订阅的客户,您可以先加入他们。

    【讨论】:

    • 谢谢。我的设计效率如何?我是否应该在订阅上加注存储 user_id 也是多余但更快?
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2015-11-23
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多