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

fykwrbwg  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(251)

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

user
========
user_id
name

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

subscription
========
customer_id
product_id

我有一个products表,它为所有用户存储“主”定价:

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

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

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

我正在为需要产品价格/覆盖价格的表订阅编写触发器。既然覆盖的价格是基于用户id的,但我没有将用户id存储在此表中,那么如何编写一个语句,根据为此订阅设置的客户id从客户表中检索用户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;

我的设计效率如何?我应该这样保存它还是开始在订阅中存储用户id?

h9vpoimq

h9vpoimq1#

从订阅表开始,然后加入客户,然后加入用户价格。

-- 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'

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

4nkexdtk

4nkexdtk2#

根据您的数据库支持的内容,您可以通过几种方式来实现这一点。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

相关问题