나는이 작은 문제에 대해 내 마음을 감싸려고 노력하고있다.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") 테이블을 기반으로 필터링하는 동안 어떤 종류의 폭포 또는 캐스케이드 규칙에 근거한 최우선 순위 기록?
글을 쓰거나 글을 올릴 방법이 확실하지 않은 경우.
또는 반복 저장 프로 시저로 실행해야하는 경우에도 문제가 없습니다.
감사합니다.
Brilliant! 여러 개의 왼쪽 조인 + 합치면 ... 그 자신을 결코 생각하지 못했을 것입니다. 감사합니다! –