2010-01-19 19 views
0

我有一個相當複雜的邏輯查詢,我試圖執行。基本上有一系列相關的表格。我很難找出一個好辦法來處理它。如何處理這個特定的查詢

表:

交易 -
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中的邏輯查詢,會有幫助嗎?

+2

如何如果折扣中沒有記錄,則指向商品的交易鏈接? – 2010-01-19 17:31:31

+0

有一張名爲purchase的表格,其中包含item_id - 我沒有發現需要列出它。我是不是該? – 2010-01-19 17:54:42

+0

是的,因爲你所要求的僅僅是你列出的表格是不可能的。 – 2010-01-20 04:52:19

回答

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 
+0

很好......這看起來好像會做。我今天下午或者明天可能會試一試。 – 2010-01-19 17:59:34

+0

他加入了t.item_id,在上面列出的表佈局中不存在... – 2010-01-20 04:53:25

+0

「假設您在交易表上有item_id」 - 他冒昧地將其添加。另外,我已經添加了必要的表格以正確地從Transaction-> Item中獲取。 – 2010-01-20 15:27:05

1

德里克,我會建議一個存儲功能。創建功能後,你可以簡單地做到這一點:

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

我不認爲你可以。對於特定的T_id,如果沒有折扣,則無法連接到item_id,因爲只有item_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 
0

另一種方法 - 執行兩個條件作爲單獨的查詢併合並結果,例如,沿着東西線(調整你的課程表)

SELECT unadjustedPrice as Price FROM Transaction WHERE noDiscount = true 
UNION ALL 
SELECT unadjustedPrice - discount as Price From Transaction WHERE noDiscount = false 

當然你真正的查詢會更復雜,因爲你需要在適當的表格加入,但是這應該給你的一般方法。

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 

您可能需要在所有情況下都適用該查詢,但它應該可以工作。

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