我需要维护一个材料表。每种材料可能有一种或多种替代材料,因此它会在同一张桌子上形成多对多关系。用户可以通过给定材料的部件号查询备选方案。
我创建了两个表,如下所示。
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_idSELECT pn_id FROM mapping WHERE main_pn_id=$id
最后,使用pn_id从材料表中查找pn。
我知道可以通过子查询或UNION来获取材料的替代品,但使用子查询和UNION可能会影响查询性能。我的系统可能被数百人使用。
我尝试使用JOIN来完成查询,但我仍然无法弄清楚如何在我的情况下使用JOIN来查询备选方案。有人可以帮我这个吗? 感谢。
答案 0 :(得分:1)
为什么不两次简单地连接到Material。
注意我在这里使用左连接,因为我不确定所有材料是否都在映射表中。
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'