這是結構這種關係的表的正確方法?
是的,但你並不需要通過對成分表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藥劑以這種方式工作,但它只是一個額外的想法。
感謝您回覆我。第二個查詢絕對是一個可行的解決方案。效果不堆疊,但可以有多個匹配的效果,因此我可以在php中取出任何具有大於1的計數的效果。我不確定第一個查詢中發生了什麼,但我認爲我需要的是與SELECT DISTINCT相反的情況,如果存在這樣的情況。感謝您的幫助,這讓我大開眼界。 – pdizz 2012-01-31 14:41:57
嗨,很高興幫助!這是一個有趣的工作。 – Aaron 2012-01-31 14:44:40
現在,我知道該找什麼,我發現這篇文章尋找重複http://www.petefreitag.com/item/169.cfm它看起來像我可以添加HAVING(COUNT(email)> 1),但使用eff_name縮小範圍。 – pdizz 2012-01-31 15:02:37