Sql 如何处理此特定查询

Sql 如何处理此特定查询,sql,mysql,Sql,Mysql,我正在尝试执行一个相当复杂的逻辑查询。基本上有一系列相关的表。我很难想出一个好办法来解决这个问题 表: 交易- T_id 折扣- D_id 项目标识 类型(百分比或基本值) 价值观 交易折扣- T_id D_id 项目- 项目标识 价格 编辑:附加表格 购买 T_id 项目编号 我试图在应用折扣后提取调整后的价格。我想避免在数据库中添加另一个带有调整价格的列。。。因为可以根据已输入的数据计算每笔交易的调整价格(因此存储此数据是多余的) 这是基本逻辑: if(this transaction ha

我正在尝试执行一个相当复杂的逻辑查询。基本上有一系列相关的表。我很难想出一个好办法来解决这个问题

表:

交易-
T_id

折扣-
D_id
项目标识
类型(百分比或基本值)
价值观

交易折扣-
T_id
D_id

项目-
项目标识
价格

编辑:附加表格
购买
T_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中执行包含逻辑的查询,这会有所帮助吗?

只要您可以创建一个查询(可能是左连接),该查询包含原始价格,如果存在折扣价格,则可以使用if语句选择折扣价格(如果存在)


只要您可以创建一个查询(可能是左联接),该查询包含原始价格,如果存在折扣价格,则可以使用if语句选择折扣价格(如果存在)


德里克,我建议使用存储函数。创建函数后,您只需执行以下操作:

select item_id, price_after_discount(item_id) from item where ....

德里克,我建议使用存储函数。创建函数后,您只需执行以下操作:

select item_id, price_after_discount(item_id) from item where ....

我想你做不到。对于特定的T_id,如果没有折扣,您就无法加入到项目id,因为只有
项目
表和
折扣
表才有项目id

如果希望在没有折扣的情况下进行交易,则需要更改表的设置方式

您可以尝试以下方法:

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
除非您想对特定项目的每个实例应用特定折扣。然后,您将需要执行以下操作:

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

我想你做不到。对于特定的T_id,如果没有折扣,您就无法加入到项目id,因为只有
项目
表和
折扣
表才有项目id

如果希望在没有折扣的情况下进行交易,则需要更改表的设置方式

您可以尝试以下方法:

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
除非您想对特定项目的每个实例应用特定折扣。然后,您将需要执行以下操作:

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

另一种方法-将这两个条件作为单独的查询执行,并将结果合并,例如,按照(当然,为您的表进行调整)的行


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

另一种方法-将这两个条件作为单独的查询执行,并合并结果,例如(当然为您的表调整)

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

有一种方法可以使用。例如:

Select item_id, price*if(discount.type, discount.value, 1) 
from item join discount on item.item_id = discount.item_id
在查询在所有情况下都能正常工作之前,您可能需要对其进行处理,但它应该能正常工作。

有一种方法可以使用。例如:

Select item_id, price*if(discount.type, discount.value, 1) 
from item join discount on item.item_id = discount.item_id

在所有情况下都能正常工作之前,您可能需要处理该查询,但它应该能正常工作。

假设您在事务表上有一个item\u 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

假设您在Transactions表上有一个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
尝试以下方法:

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
尝试以下方法:

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

如果折扣中没有记录,交易如何链接到项目?有一个名为purchase的表包含项目id-我觉得没有必要列出它。我应该吗?是的,因为你所要求的仅仅是你列出的表是不可能的。如果没有折扣记录,交易如何链接到项目?有一个名为purchase的表包含项目id-我觉得没有必要列出它。我应该吗?是的,因为你所要求的仅仅是你列出的表格是不可能的。非常好。。。看起来这样就可以了。我将在今天下午或明天进行尝试。他将加入t.item_id,这在您上面概述的表布局中不存在…“假设您在交易表上有一个item_id”-他随意添加了它。此外,我还添加了必要的表,以便正确地从Transaction->Item中获取。从新信息(Pruchase表)中,这应该可以工作了。非常好。。。看起来这样就可以了。我将在今天下午或明天进行尝试。他将加入t.item_id,这在您上面概述的表布局中不存在…“假设您在交易表上有一个item_id”-他随意添加了它。此外,我还添加了必要的表,以便正确地从Transaction->Item中获取。从新信息(Pruchase表)中,这应该可以正常工作了。