表2中的三个连接字段覆盖了表1中的三个连接字段

时间:2018-01-02 14:20:37

标签: php mysql sql

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

user
========
user_id
name

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

subscription
========
customer_id
product_id

我有一个产品表,用于存储" master"所有用户的定价:

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

但我可以覆盖某些或所有产品'一些用户的价格。

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

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

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订阅。 ?

2 个答案:

答案 0 :(得分:1)

您从订阅表开始,然后加入客户,然后加入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'

由于您必须拥有此订阅的客户,您可以在之前加入。

答案 1 :(得分: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