2016-06-02 3 views
0

나는이 작은 문제에 대해 내 마음을 감싸려고 노력하고있다.MySQL 다중 레벨 중첩 우선 순위가 높은 경우?

차량 정보 (예 : 모델, 유형, 부속 유형, 부품 번호 및 부품 제목)가 포함 된 여러 표를 결합하여 특정 "위치"항목을 포함 할 수있는 "제목 대체"표를 검토합니다 차량 부품은 특정 차량 제조업체, 모델, 유형 또는 부속 유형에 대해 특정 사례에서 제목을 덮어 씁니다.

마찬가지로 모든 BMW 차량에는 표준 오일을 사용하고 BMW M5에는 표준 오일을 다른 고급 오일로 대체하는 예외가 있습니다. 또는이 표에 별도로 명시하지 않는 한 모든 자동차에 표준 오일을 사용한다고 가정하십시오. 그리고 우선 순위 목록을 아래로 이동 :

  • 특정 모델 (가장 높은 우선 순위)
  • 특정 메이크업 (2 가장 높은 우선 순위) (3 가장 높은 우선 순위)

그래서 재정의 테이블

  • 하위 유형 (

    id | type_id | make_id | subtype_id | model_id | part_id | part_override 
    1 | 2  | 0 | 0  | 0  | 33 | Global-Replacement-Oil 
    2 | 2  | 1 | 0  | 0  | 33 | Yamaha-Premium-Oil 
    3 | 2  | 0 | 2  | 0  | 33 | Global-Dirtbike-Oil 
    4 | 2  | 1 | 4  | 0  | 33 | Yamaha-Streetbike-Oil 
    5 | 2  | 0 | 0  | 199 | 33 | Yamaha-R6-2015-Oil 
    

    ** TYPE_ID = 자동차, 오토바이에 대한, TYPE_ID = 3이다 2 : "OV")는 다음과 같이 보입니다 예

    ** make_id, subtype_id 또는 model_id가 0 인 경우 값이 <> 0이 아닌 이상 재정의가 모든 제조업체, 하위 유형 및 모델에 적용되어야 함을 의미합니다.

    해당 part_id = 33, 응용 프로그램에서 쿼리되는 모델 및 해당 "매트릭스"에 맞는 위치에 따라 여러 번이 아니라 내 결과에 한 번만 표시하면됩니다.

    Yamaha R6 2015 버전에서이 쿼리를 실행하고 해당 모델의 해당 part_id = 33에 대한 코드/제목을 가져와야하는 경우 "model_id"열이 다른 모든 것들보다 우선 순위가 높습니다. 다른 모든 것들은 무시하고 레코드 # 5의 제목을 보여줍니다.

    다른 야마하 스트리트 자전거를 골라 내면 가장 높은 우선 순위는 기록 # 4가됩니다 (make_id와 subtype_id가 모두 정의되어 있음).

    또는 Dirtbike를 임의로 선택하면 subtype_id의 레코드 # 3에서 일치하므로 코드/제목이 대신 표시됩니다.

    야마하 자전거를 골라 내면 레코드 # 2 (make_id에)와 일치합니다.

    마지막으로 임의의 자전거를 지정하지 않고 임의의 자전거를 선택하면 type_id (자전거 = 2) 만 일치하게되므로 레코드 # 1이 대신 표시됩니다.

    SELECT DISTINCT 
    CASE 
        WHEN p.part_id = '72' AND ov.part_override != "" AND ov.type_id = p.type_id AND 
        (CASE 
         WHEN ov.model_id IS NOT NULL 
         THEN ov.model_id = "$MODEL_ID" 
         ELSE 
         CASE 
          WHEN ov.make_id != 0 
          THEN ov.make_id = m.make_id 
          ELSE 
          CASE 
           WHEN ov.subtype_id != 0 
           THEN ov.subtype_id = st.subtype_id 
           ELSE 1 
          END 
         END 
         END) 
        THEN ov.part_override 
        ELSE p.part_number 
    END part_number, 
    ov.make_id, 
    .... 
    FROM parts p ON ... 
    INNER JOIN makes m ON p.make_id = m.make_id 
    INNER JOIN ... 
    (just joining a bunch of other separate tables that contain all types, 
    subtypes, models and so on, respectively - irrelevant for the logic above) 
    

    내가이 쿼리를 얻고 것은 내가 실행하는 경우, 그래서 나열된 특정 모델에 적용되는 모든 부분입니다 :

    은 지금까지 (또는 그것의 일부) 그 쿼리입니다 Yamaha R6 2015와 같은 특정 모델에 대해서는 레코드 # 1,2 및 5가 표시됩니다. 그러나 위의 설명처럼 중요도와 우선 순위에 따라 # 5 번 레코드가 필요합니다.

    GROUP BY part_id 또는 그와 비슷한 항목을 사용하면 하나의 레코드 만 표시되지만 가장 높은 우선 순위 측면에서는 반드시 올바른 것은 아닙니다.

    무엇이 누락 되었습니까?

    또는이 전체 중요도/우선 순위를 확인하여 해당 쿼리를 계단식으로 처리하면 다른 조인 된 테이블의 모든 부품 레코드를 검토하고이 재정의 ("ov") 테이블을 기반으로 필터링하는 동안 어떤 종류의 폭포 또는 캐스케이드 규칙에 근거한 최우선 순위 기록?

    글을 쓰거나 글을 올릴 방법이 확실하지 않은 경우.

    또는 반복 저장 프로 시저로 실행해야하는 경우에도 문제가 없습니다.

    감사합니다.

  • 답변

    1

    다른 테이블 조인이나 여기에있는 실제 테이블 이름을 더 이상 보지 않고 무시 테이블에 여러 개의 왼쪽 조인이있는 항목을 원한다면 첫 번째 FOUND 값을 기반으로 COALESCE를 가져올 수 있습니다. 같은 것 ..

    select 
         ... 
         coalesce(P_OV.part_override, M_OV.part_override, 
          MOD_OV.part_override, P.PartName) as FinalPartName 
        from 
         Parts P 
         left join PartsOverride P_OV 
          on p.id = P_OV.part_id 
         join make m 
          on p.make_id = m.make_id 
          left join PartsOverride M_OV 
           on m.make_id = M_OV.make_id 
         join model mo 
          on p.model_id = mo.model_id 
          left join PartsOverride MOD_OV 
           on m.make_id = MOD_OV.make_id 
    

    그런 다음 coalesce() 내에서 원하는 "OV"버전의 우선 순위를 변경할 수 있습니다. 모델이 make보다 우선 순위가 높은 경우 :

    coalesce(MOD_OV.part_override, M_OV.part_override, 
         P_OV.part_override, P.PartName) as FinalPartName 
    

    어느 필드가 NULL이 아닌 첫 번째 WINS.

    +0

    Brilliant! 여러 개의 왼쪽 조인 + 합치면 ... 그 자신을 결코 생각하지 못했을 것입니다. 감사합니다! –

    관련 문제