MySQL的新手寻找多对多关系查询

时间:2012-01-31 02:17:23

标签: mysql foreign-keys many-to-many relational-database

一些背景我有一组数据代表了天际的炼金术成分及其效果。如果您对此不熟悉,可以将2-4种成分组合成药水。每种成分都有4种效果。如果成分之间的任何影响是相同的,它将使这种类型的药水。我已经确定这是一个多对多的关系,我像这样设置我的表:

成分:ing_id(key),ing_name,(其他补充信息)

效果:eff_id(key),eff_name

ing_eff_xref:eff_id,ing_id

我想输入2种或更多可用成分并返回可能的组合而不知道效果是什么。我的sql经验几乎只限于phpmyadmin和简单的选择查询。我想我的问题是:这是为这种类型的关系构建表的正确方法,如果我不打算更新表,是否需要设置外键,并且是否有可以采用一组的查询ing_names并只返回相交的eff_names?

如果有人感兴趣,这是db的mysqldump:http://dl.dropbox.com/u/59699040/alchemy_db.sql

1 个答案:

答案 0 :(得分:1)

  

这是为这种关系构建表的正确方法吗?

是的,但是你不需要在成分表上使用effect1到effect4。

  

如果我不打算更新表,是否需要设置外键?

是。获取所需数据的唯一方法是将三个表连接在一起。没有外键(或更具体地说,适当的索引),可能在查询上表现不佳。当然,你的整体行数确实很少,但在这种情况下使用外键是一种很好的做法。

  

是否有一个查询可以采用一组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来消除这些效果。

“天际”中的药水效果可以堆叠吗?如果它们可以堆叠,那么您可以使用COUNT执行GROUP BY查询以获取每个效果的堆叠值:

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.不确定天际魔药是否以这种方式工作,但这只是一个额外的想法。