我正在尝试执行一个相当复杂的逻辑查询。基本上有一系列相关的表格。我很难找到一个接近它的好方法。
表格:
交易 -
T_ID
折扣 -
D_ID
ITEM_ID
类型(百分比或基本值)
值
Transaction_Discount -
T_ID
D_id
项目 -
ITEM_ID
价格
编辑:附加表格
的购买
T_ID
ITEM_ID
我试图在应用折扣后调整价格。我想避免将另一列调整后的价格添加到数据库中......因为可以根据已输入的数据计算每笔交易的调整价格(因此存储此数据是多余的)。
这是基本逻辑:
if(this transaction had a discount applied)
//apply the discount and return the adjusted price
else(no discount applied)
//pull price
可以使用PHP逻辑在几个单独的查询中执行此操作。
//1st step - create an array of bool's: true = discount_used/false = no_discount
//2nd step - if(discount_used) return price adjusted to discount
//3rd step - if(no_discount) return price
//4th step - combine the two different arrays
这显然非常笨重。似乎有一个更好的方法来做到这一点可能会更有效率。
我的理解是你可以在mysql中执行包含逻辑的查询,这会有帮助吗?
答案 0 :(得分:2)
假设您在交易表上有一个item_id,并且百分比由'P'表示,您可以尝试类似
SELECT *,
CASE
WHEN td.T_id IS NULL
THEN it.price
WHEN td.T_id IS NOT NULL AND d.Type = 'P'
THEN id.price - (id.price * d.value)
ELSE id.price - d.value
END PriceDiscounted
FROM Transaction t LEFT JOIN
Purchase p ON t.T_id = p.T_id LEFT JOIN
Item it ON p.item_id = it.item_id LEFT JOIN
Transaction_Discount td ON t.T_id = td.T_id LEFT JOIN
Discount d ON td.D_id = d.D_id LEFT JOIN
Item id ON d.item_id = id.item_id
答案 1 :(得分:1)
Derek,我建议存储函数。创建函数后,您可以简单地执行此操作:
select item_id, price_after_discount(item_id) from item where ....
答案 2 :(得分:1)
您可以使用if statement in mysql。所以,例如:
Select item_id, price*if(discount.type, discount.value, 1)
from item join discount on item.item_id = discount.item_id
在所有情况下,您可能需要先处理该查询,但它应该可以正常工作。
答案 3 :(得分:1)
尝试这种方法:
select i1.item_id,
i1.Price,
case when dt.item_id is null then i1.Price else i1.Price - dt.TotalDiscount end as DiscountedPrice
from Item i1
left outer join (
select i.item_id, sum(
case when d.type = 'percentage' then i.price * d.value / 100 else d.value end
) as TotalDiscount
from Item i
inner join Discount d on i.item_id = d.item_id
group by i.item_id
) dt on i1.item_id = dt.item_id
答案 4 :(得分:0)
只要您可以创建具有原始价格的查询(可能是左连接),并且如果它存在折扣价格,那么您可以使用IF语句选择折扣价(如果存在)。
答案 5 :(得分:0)
我认为你不能。对于特定的T_id,如果没有折扣,则无法加入item_id,因为只有table_id的表是Item
表和Discount
表。
如果您想要没有折扣的交易,您将需要更改表的设置方式。
您可以尝试以下方式:
Item table:
item_id
price
Transaction table:
T_id
item_id
D_id
Discount table:
D_id
type
value
除非您想对特定商品的每个实例应用特定折扣。然后你会想做类似的事情:
Item table:
item_id
price
D_id (can be null)
Transaction table:
T_id
item_id
Discount table:
D_id
type
value
答案 6 :(得分:0)
另一种方法 - 将两个条件作为单独的查询执行并将结果合并,例如一些事情(当然要调整你的表格)
SELECT unadjustedPrice as Price FROM Transaction WHERE noDiscount = true
UNION ALL
SELECT unadjustedPrice - discount as Price From Transaction WHERE noDiscount = false
当然,您的真实查询会更复杂,因为您需要加入适当的表格,但这应该为您提供一般方法。