2017-10-10 99 views
-1

我需要維護一個物料表。每種材料可能有一種或多種替代材料,因此它將在同一張桌子上形成多對多的關係。用戶可以通過給定物料的零件號查詢替代物。查詢來自同一多對多表

我創建了兩個表,如下所示。

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 * 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'