簡體   English   中英

從同一個多對多表查詢

[英]Query from the same many-to-many table

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

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

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 來查詢我的情況。 任何人都可以幫助我嗎? 謝謝。

為什么不簡單地連接到 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM