2013-04-12 47 views
0

我有一個適度複雜的查詢來運行,爲了這個問題的目的,我已經在下面稍微簡化了一下。我有兩張桌子;在組上選擇分鐘

TABLE: plan_costs 
id, plan_id, cost, special_cost + more columns.... 
1  1   23.00 12.00 
2  1   25.00 15.00 
3  2   5.00  2.00 
4  2   45.00 28.00 
5  3   35.00 30.00 
6  3   65.00 60.00 

TABLE: plan_details 
plan_id, group_id, + more columns.... 
1   1 
2   1 
3   2 

我需要的是最便宜的計劃清單,2倍的值(在這種情況下,5和30),但每組只有一個計劃之間。當我在下面運行計劃時,我會爲每個組計劃一個計劃,但它並不總是最便宜的計劃。注意:如果不是0,有一種情況條件優先使用special_cost成本。任何想法?

SELECT p1.id, 
     p2.plan_id, 
     p1.cost, 
     p1.special_cost CASE 
          WHEN p1.special_cost = 0 THEN MIN(p1.cost) 
          ELSE MIN(p1.special_cost) 
         END AS cost_order, 
FROM plan_costs AS p1 
LEFT JOIN plan_details AS p2 ON (p2.plan_id = p1.plan_id) 
WHERE CASE 
      WHEN p1.special_cost = 0 THEN p1.cost >= 5 
      ELSE p1.special_cost >= 5 
     END 
    AND CASE 
      WHEN p1.special_cost = 0 THEN p1.cost <= 30 
      ELSE p1.special_cost <= 30 
     END 
GROUP BY p2.group_id 
ORDER BY CASE 
      WHEN p1.special_cost = 0 THEN p1.cost 
      ELSE p1.special_cost 
     END ASC 

編輯:添加最後的結果,我需要

要求的結果:

id, plan_id, cost, special_cost 
1  1   23.00 12.00 
5  3   35.00 30.00 
+0

您發佈的樣本數據的期望結果是什麼? –

+0

special_cost會比有史以來的成本低嗎? –

+0

@Mahmoud Gamal我將在html中輸出結果列表。 – Mark

回答

1

嘗試此查詢

SELECT 
    a.group_id, 
    pc.plan_id, 
    a.minCost 
FROM 
    (SELECT 
     pd.group_id, 
     min(if(pc.special_cost = 0, pc.cost, pc.special_cost)) as minCost 
    FROM 
     plan_costs pc 
    INNER JOIN 
     plan_details pd 
    ON 
     pd.plan_id = pc.plan_id 
    GROUP BY 
     pd.group_id) a 
INNER JOIN 
    plan_details pd 
ON 
    pd.group_id = a.group_id 
INNER JOIN 
    plan_costs pc 
ON 
    pc.plan_id = a.plan_id AND 
    if(pc.special_cost = 0, pc.cost, pc.special_cost) = a.minCost 

MySQL的擴展使用GROUP BY的,這樣的選擇列表可以引用未在GROUP BY子句中命名的非聚集列。服務器可以自由選擇每組中的任何值,因此在我們的案例中,plan_id不同,所以我們無法利用此功能,因此我們不得不進行額外的連接以獲得所需的結果。幫助...

+0

謝謝@Meherzad,是b.plan_id一個錯字,並意味着a.plan_id – Mark

+0

是檢查編輯... – Meherzad

+0

謝謝Meherzad ,讓我朝着正確的方向前進 – Mark