0

この質問の目的のために、以下でやや単純化した、実行する適度に複雑なクエリがあります。2 つのテーブルがあります。

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) の間の最も安いプランのリストですが、グループごとに 1 つのプランのみです。以下のプランを実行すると、グループごとに 1 つのプランが得られますが、常に最も安いプランとは限りません。注: cost が 0 でない場合、cost に優先して 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
4

1 に答える 1