[英]select min on group
我有一个中等复杂的查询要运行,出于这个问题的目的,下面我对其进行了一些简化。 我有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)之间,但每组只有一个计划。 当我在下面运行该计划时,每个组只能得到一个计划,但它并不总是最便宜的。 注意:在某些情况下,如果不为0,则优先使用special_cost而不是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
试试这个查询
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
是不同的,因此我们无法利用此功能,因此我们必须进行额外的联接才能获得所需的结果...
希望这可以帮助...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.