从同一个多对多表

时间:2017-10-10 15:03:00

标签: mysql database

我需要维护一个材料表。每种材料可能有一种或多种替代材料,因此它会在同一张桌子上形成多对多关系。用户可以通过给定材料的部件号查询备选方案。

我创建了两个表,如下所示。

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来查询备选方案。有人可以帮我这个吗? 感谢。

1 个答案:

答案 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'