2017-10-10 1 views
-1

머티리얼 테이블을 유지 관리해야합니다. 각 자료에는 하나 이상의 대체 자료가있을 수 있으므로 동일한 테이블에 다 대다 관계를 형성합니다. 사용자는 주어진 재질의 부품 번호로 대체품을 조회 할 수 있습니다.동일한 many-to-many 테이블에서의 쿼리

다음과 같이 두 개의 테이블을 만들었습니다.

CREATE TABLE material (
    id int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    pn varchar(20) NOT NULL UNIQUE 
); 
CREATE TABLE mapping (
    pn_id int(3) NOT NULL, 
    main_pn_id int(3) NOT NULL, 
    PRIMARY KEY (pn_id, main_pn_id) 
); 
ALTER TABLE mapping ADD FOREIGN KEY (pn_id) REFERENCES material (id); 
ALTER TABLE mapping ADD FOREIGN KEY (main_pn_id) REFERENCES material (id); 

내 쿼리 입력은 항상 pn (재료의 부품 번호)입니다. 그것은 select 명령이 다음과 같을 것임을 의미합니다.

SELECT * FROM material ..... WHERE pn="XXXXX"; 

특정 자료에 대한 대안을 찾고 싶습니다. 먼저 부품 번호로 ID를 쿼리해야합니다. 그런 다음 id를 사용하여 pn_id를 찾을 수 있습니다.

SELECT pn_id FROM mapping WHERE main_pn_id=$id 

마지막으로 pn_id를 사용하여 재질 표에서 pn을 찾습니다.

하위 쿼리 또는 UNION을 사용하여 재료에 대한 대안을 얻을 수 있음을 알고 있었지만 하위 쿼리와 UNION을 사용하면 쿼리 성능에 영향을 줄 수 있습니다. 내 시스템은 수백 명의 사람들이 사용할 수 있습니다.

쿼리를 완료하기 위해 JOIN을 사용하려고했지만 상황에 따라 JOIN을 사용하여 쿼리 대안을 찾는 방법을 알아낼 수 없었습니다. 아무도 친절하게 도와 줄 수 없었나요? 감사합니다. .

+0

예제 데이터와 예상되는 결과가 도움이 될 것입니다. 메인 매핑을 위해 한 번 두 번, pn 매핑을 위해 한 번 두 번 재료에 조인 할 필요가있는 것처럼 보입니다. 이제 계층을 트래버스해야하는 경우; 그것은 다른 이야기입니다. 하지만 대체 할 수있는 부분은 무엇인지 각 주체에 대해 묻는 것 같습니다. 재료 및 매핑 데이터는 약간 모호하므로 정확한 SQl에 대한 확신이 없으므로 샘플 데이터가 예상되는 결과를 보려는 욕구가 있습니다. – xQbert

답변

1

왜 재료에 단순 결합하지 않습니까?

참고 모든 재료가 매핑 테이블에 있는지 확실하지 않으므로 여기에 왼쪽 조인을 사용했습니다.

SELECT M1.ID as MainPartID 
    , M1.PN as MainPartNumber 
    , M2.ID as AltPartID 
    , M2.PN as AltPartNum 
FROM material M1 
LEFT JOIN Mapping Map 
on M1.ID = MAP.PN_ID 
LEFT JOIN Material M2 
on M2.ID = MAP.Main_PN_ID 
WHERE M1.PN = 'XXXXX'