如何处理这个特定的查询

时间:2010-01-19 17:26:14

标签: sql mysql

我正在尝试执行一个相当复杂的逻辑查询。基本上有一系列相关的表格。我很难找到一个接近它的好方法。

表格:

交易 -
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中执行包含逻辑的查询,这会有帮助吗?

7 个答案:

答案 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语句选择折扣价(如果存在)。

http://dev.mysql.com/doc/refman/5.1/en/if-statement.html

答案 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

当然,您的真实查询会更复杂,因为您需要加入适当的表格,但这应该为您提供一般方法。