MySQL - 由FK通过多个表格进行工作

时间:2017-08-18 12:43:48

标签: mysql relationship

我有一个不属于我自己创建的数据库。我需要从中提取一些特定的数据,但是我正在努力解决如何在不进行多次查询和循环遍历代码中的结果集的情况下获取数据的方法。我已经查看了其他问题但是还没有能够走得太远。

我的数据结构是(非常精简,省略了不相关的行和列):

MyDb.Source
+--------+-------------+--------------------------------------+
| ID     | SOURCE_TYPE |  URL                                 |
+--------+-------------+--------------------------------------+
| 10     |          3  |  https://en.wikipedia.org            |
+--------+-------------+--------------------------------------+

MyDb.Resource
+--------+------------+--------------------------------------+
| ID     | SOURCE_FK  |  IDENTIFIER                          |
+--------+------------+--------------------------------------+
| 1      |         10 |  All_Saints_Church,_Marple           |
+--------+------------+--------------------------------------+

MyDb.Item_Base
+--------+-------------+--------------------------------------+
| ID     | RESOURCE_FK |  ITEM_TITLE                          |
+--------+-------------+--------------------------------------+
| 55     |          1  |  All Saints Church, Marple           |
+--------+-------------+--------------------------------------+

MyDb.Item
+--------+-------------+--------------------------------------+
| ID     | BASE_FK     |  ITEM_DESCRIPTION                    |
+--------+-------------+--------------------------------------+
| 120    |         55  |  Foo bar                             |
+--------+-------------+--------------------------------------+

来源 - 资源是1对多。

资源 - 基数为1比1.

Item_Base - 项目是1比1.

我想做什么?

我希望尽可能少的查询从MyDb.Source返回以查找与其相关的所有项目。我手中的唯一信息是来源的ID,即10。我希望最终得到Item.ID的结果集,其中只包含Source.ID为10的结果集

2 个答案:

答案 0 :(得分:1)

我认为你可以在一个查询中将四个表连接在一起。这应该是安全的,因为为了在源和项之间存在关系,后者必须通过密钥关系可以访问。

SELECT
    t1.ID AS source_id,
    t4.*
FROM Source t1
INNER JOIN Resource t2
    ON t1.ID = t2.SOURCE_FK
INNER JOIN Item_Base t3
    ON t2.ID = t3.RESOURCE_FK
INNER JOIN Item t4
    ON t3.ID = t4.BASE_FK
WHERE
    t1.ID = 10

答案 1 :(得分:1)

您的查询中需要INNER JOIN个。然后可以通过一个简单的查询:

SELECT 
  i.ID 
FROM
  Source s
  INNER JOIN Resource r
    ON s.ID = r.SOURCE_FK
  INNER JOIN Item_Base b
    ON r.ID = b.RESOURCE_FK
  INNER JOIN Item i
    ON b.ID = i.BASE_FK
WHERE
  s.ID = 10

有关联接及其使用方式的更多信息和示例,请参阅https://dev.mysql.com/doc/refman/5.7/en/join.htmlhttp://www.mysqltutorial.org/mysql-inner-join.aspx