用户创建新客户。客户拥有产品订阅。
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订阅。 ?
答案 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