2012-01-31 46 views
1

一些背景我有一套數據,代表鍊金術成分及其來自天際的影響。如果你不熟悉這個,你可以結合2-4種成分製造藥水。每種成分有4種效果。如果配料之間的任何效果相同,則會製作該類型的藥水。我已經確定這是一個許多一對多的關係,我建立了我的表像這樣:MySQL的新手尋找多對多的關係查詢

成分:ing_id(鍵),ing_name,(其它輔助信息)

效果:eff_id(鍵) ,eff_name

ing_eff_xref:eff_id,ing_id

我想輸入2個或更多可用的成分和不知道效果是什麼返回可能的組合。我的sql經驗幾乎侷限於phpmyadmin和簡單的選擇查詢。我想我的問題是:這是正確的方式來構建這種關係類型的表,如果我不打算更新表,是否需要設置外鍵,並且是否有一個查詢可以採取一組ing_names並只返回相交的eff_names?

這裏是分貝的mysqldump如果有人有興趣:http://dl.dropbox.com/u/59699040/alchemy_db.sql

回答

1

這是結構這種關係的表的正確方法?

是的,但你並不需要通過對成分表effect4有EFFECT1。

如果我不打算更新表,我需要設置外鍵嗎?

是的。獲取您所追求的數據的唯一方法是將三個表連接在一起。沒有外鍵(或更具體地說,適當的索引),可能在查詢上表現不佳。當然你總體上只有少量的行,但在這種情況下使用外鍵是一種很好的做法。

是否有一個查詢可以接受一組ing_names並僅返回 eff_names相交?

我覺得你這樣的事情後:

SELECT e.eff_name 
FROM ingredients i 
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id 
INNER JOIN effects e ON e.eff_id = ie.eff_id 
WHERE i.ing_name = 'Abecean Longfin '; 

如果您需要查看多種成分的效果,你可以調整你的WHERE子句,像這樣:

WHERE i.ing_name IN ('Abecean Longfin ','Eye of Sabre Cat ','Bear Claws '); 

你可能不想要重複的效果,所以你可以做一個SELECT DISTINCT來消除這些效果。

在天際可以藥水效果疊加嗎?如果他們可以疊加,那麼你可以做一個GROUP BY查詢與COUNT讓每個效果堆疊值:

SELECT e.eff_name, count(*) as value 
FROM ingredients i 
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id 
INNER JOIN effects e ON e.eff_id = ie.eff_id 
WHERE i.ing_name IN ('Eye of Sabre Cat ','Bear Claws ') 
GROUP BY e.eff_name; 

此查詢將列出6個效果爲1的值,而「恢復體力」會有2的值。不知道是否Skyrim藥劑以這種方式工作,但它只是一個額外的想法。

+0

感謝您回覆我。第二個查詢絕對是一個可行的解決方案。效果不堆疊,但可以有多個匹配的效果,因此我可以在php中取出任何具有大於1的計數的效果。我不確定第一個查詢中發生了什麼,但我認爲我需要的是與SELECT DISTINCT相反的情況,如果存在這樣的情況。感謝您的幫助,這讓我大開眼界。 – pdizz 2012-01-31 14:41:57

+0

嗨,很高興幫助!這是一個有趣的工作。 – Aaron 2012-01-31 14:44:40

+0

現在,我知道該找什麼,我發現這篇文章尋找重複http://www.petefreitag.com/item/169.cfm它看起來像我可以添加HAVING(COUNT(email)> 1),但使用eff_name縮小範圍。 – pdizz 2012-01-31 15:02:37