繁体   English   中英

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

[英]New to MySQL looking for Many-to-Many relationship query

我有一些背景资料,代表了炼金术成分及其对天际的影响。 如果您不熟悉此方法,则可以结合2-4种成分制成药水。 每种成分都有4种效果。 如果成分之间的效果相同,则将制成该类型的药水。 我已将其确定为多对多关系,并按如下方式设置表格:

成分:ing_id(关键字),ing_name((其他补充信息)

效果:eff_id(键),eff_name

ing_eff_xref:eff_id,ing_id

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

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

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

是的,但是您不必在成分表上具有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,“ Restore Stamina”的值为2。不确定Skyrim药水是否以此方式工作,但这只是一个额外的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM