mysql - MySQL 新手寻找多对多关系查询

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

一些背景 我有一组数据代表炼金术成分及其来自天际的影响。如果你对此不熟悉,你可以将 2-4 种成分混合在一起制成药水。每种成分有4种功效。如果成分之间的任何效果相同,就会制成那种类型的药水。我已将其确定为多对多关系,并像这样设置我的表:

成分: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

最佳答案

is this the right way to structure the tables for this type of relationship?

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

do I need to set foreign keys if I don't plan on updating the tables?

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

is there a query that can take a set of ing_names and return only eff_names that intersect?

我认为您正在寻找这样的东西:

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

关于mysql - MySQL 新手寻找多对多关系查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073586/

相关文章:

javascript - 数据库数据从不显示在html中

php - 创建广告多维数组并使用 foreach 循环显示它

Django 从多对多关系中删除对象

mysql - 多个表的外键

database - 使用什么 NoSQL 数据库?

mysql - Symfony 中的多对多和多对一关系

php - laravel 从数据库中获取 microtime

php - 我的更新 cade 有什么问题吗?

求助MySQL FOREIGN KEY

mysql - 由父表中的部分主键组成的复合外键