2013-04-12 5 views
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 

은 내가 필요한 것은 (이 경우 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

특별 비용은 비용보다 적습니까? –

+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이 그렇게 선택 목록이 그 BY GROUP의 사용을 확장이 쿼리 GROUP BY 절에 이름이 지정되지 않은 집계되지 않은 열을 참조 할 수 있습니다. 서버는 각 그룹에서 임의의 값을 자유롭게 선택할 수 있으므로 우리의 경우에는 plan_id이 다르므로이 기능을 사용할 수 없으므로 원하는 결과를 얻으려면 추가 조인을해야합니다.

희망 사항 도움이됩니다 ...

+0

감사합니다. @Meherzad는 b.plan_id가 오타이고 a.plan_id가되어야합니다. – Mark

+0

예 ... 편집을 확인하십시오. – Meherzad

+0

감사합니다 Meherzad , 옳은 방향으로 갈거야. – Mark