この質問の目的のために、以下でやや単純化した、実行する適度に複雑なクエリがあります。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