2011-03-07 5 views
6

표 1과 나는 "마스터"가격을 저장하는 제품 테이블이 있습니다가입 - 테이블이 재정의 필드가

제품
==========합니다.
ID
partnum
설명
가격
installtime

등 내 생각은 다른 테이블에서 딜러 별 차이를 저장하기 위해 다른 가격을 설정, 정가를 오버라이드 (override) 시간을 설치할 수 있습니다

딜러이었다 :

무시
========= =.
내가 딜러의 가격에 대한 DB를 조회 할 때, 나는이 테이블에 가입해야
partnum
가격
installtime

dealerID. 재정의 테이블의 값을 제품 테이블의 값보다 우선해야합니다.

SELECT partnum, price, installtime FROM products 
JOIN overrides ON products.partnum = overrides.partnum 
WHERE dealerID = 123 

작성된 것처럼 물론 오류가 발생합니다. 요점은 제품 테이블의 가격 대신에 대체 테이블에서 가격이 필요하다는 것입니다 (설치시와 동일). 다른 필드 이름을 사용하고 PHP 계층에 로직을 옮길 수 있습니다. 그러나 SQL은이를 처리 할 수 ​​있어야합니다.

답변

12

우선 IFNULL과 함께 LEFT JOIN을 사용하여 우선 적용을 확인하고 대체가없는 경우 대체합니다.

SELECT p.partnum, 
    IFNULL(d.price, p.price) AS price, 
    IFNULL(d.installtime, p.installtime) AS installtime 
FROM products p 
    LEFT JOIN overrides d ON d.dealerID = 123 
     AND p.partnum = d.partnum 

참고 : 나는 특정 대리점에 대한 모든 제품 및 오버라이드 (override)를 검색, 조인 조건에 WHERE dealerID = 123을 움직였다.

+0

감사합니다. 이것은 아름답게 작동합니다. IFNULL과 COALESCE간에 차이가 있습니까? MySQL 문서를 살펴보면 필자는 두 문서 사이에 큰 차이가 없음을 알 수있다. – skypanther

+1

@skypanther 아니요, 'IFNULL'은 MySql에서 지원하고, 'COALESCE'는 ANSI 표준이며 모든 RDBMS에서 지원합니다. –

+0

글쎄, 나는이 질문을 mysql 질문으로 태그를 붙 였으므로 나는 Tyler Eaves에게 그것을 주겠다고 오랫동안 생각했지만 대답을 너에게 줄 것이다. – skypanther

3

왼쪽 조인으로 수행 한 다음 재정의 열을 먼저 사용하여 각 필드에 병합을 사용하십시오. Coalesce는 첫 번째 널 (null)이 아닌 인수를 리턴합니다.

select coalesce(overrides.partnum, products.partnum) ... etc. 
+0

감사의 말 @ tyler-eaves 이것은 Scrum Meister의 솔루션과 마찬가지로 잘 작동한다. 나는 대답으로 설정 해야할지 모르겠다. 아무도 나에게 두 기능을 구분할 수 있는지 기다릴거야. – skypanther