-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查詢備選方案。任何人都可以幫助我嗎? 謝謝。
樣本數據和預期結果將有所幫助。看起來你只需要爲主映射連接兩次材料,並且一次連接到pn映射。現在,如果你需要遍歷一個層次結構;這是一個不同的故事。但你似乎只是要求每個主要部分可以被替代的部分。材料和製圖數據有點模糊,因此我不確定SQl的準確性,因此希望看到示例數據的預期結果。 – xQbert