左加入外键

时间:2013-07-24 18:11:12

标签: mysql foreign-keys left-join primary-key

也许我的失败是不知道术语,但我希望在两个表上执行JOIN,将另一个表作为外键。

因此表A上项的id用于从表B获取外键,用于从表C中获取文本表示。

TABLE A
+----+------------+
| id | name       |
+----+------------+
| 1  | comment    |
+----+------------+
TABLE B
+-----------+------------------+
| object_id | cat_id_ref       |
+-----------+------------------+
|         1 |                2 |
+-----------+------------------+
|         1 |                3 |
+-----------+------------------+
TABLE C
+---------+----------+
| cat_id  | cat_type |
+---------+----------+
|       1 | Mean     |
|       2 | Nice     |
|       3 | Rude     |
+---------+----------+

所以问题是2部分。什么是这个1步之外的外键查找称为术语,而对于MySQL这个子查询是什么?此类JOIN

的最佳做法

期望的结果是:

+----+------------+------------+
| id | name       | cat_type   |
+----+------------+------------+
| 1  | veg 1      | Nice       |
+----+------------+------------+
| 1  | veg 1      | Rude       |
+----+------------+------------+

3 个答案:

答案 0 :(得分:2)

这看起来像是多对多的关系。我将表B称为"关联"表(或者,有时是"关系"表,在某些情况下,这可以称为"成员资格"表。)

从数据库设计的角度来看,我们进行了实体关系建模"。一个"实体"是一个可以唯一识别的人,地点,事物,概念或事件,是企业感兴趣的,我们可以存储有关的信息。我们有"关系"这些实体之间。当我们确定了一个关系时,我们会问正确的问题,找出一个实体与另一个实体有多少相关。

在您的示例中,看起来B实现了实体A和C之间的关联。

  • A" A"可以与零,一个或多个相关," C"。
  • A" C"可以与零,一个或多个" A"。
  • 相关

(这是识别实体的合适名称可以使模型更容易理解的地方。)

为了解决多对多问题,我们实现了第三个表格,我们可以将其命名为" A_C"或" C_A",或者它可能有一个完全不同的名称。 (例如," COMMITTEE"和" PERSON"之间的关联可能被称为"会员")。

在您的示例中,新表名为" B"

  • A" B"与一个" A"
  • 完全相关
  • A" B"与一个" C"
  • 完全相关
  • A" A"与零,一个或多个" B"
  • 有关
  • A" C"与零,一个或多个" B"
  • 有关

引入" B" table将多对多关系解析为两个" one-to-many"关系。

(看起来你已经了解了外键如何在关系的"许多"方面,以及它是如何引用关键的主键(或唯一键)关系的一个"侧的实体表:外键的值是另一个表中主键值的副本。)


至于问题的第二部分,这里是一个返回指定结果集的查询示例:

SELECT a.id
     , a.name
     , c.veg_type
  FROM A a
  LEFT
  JOIN B b
    ON b.object_id = a.id
  LEFT
  JOIN C c
    ON c.veg_id = b.veg_type_ref

(有不同的查询将返回相同的结果集;最大的区别在于处理"缺少"(例如,表A中没有&#34的行) ;匹配"表B中的行。其他差异是性能,取决于基数,选择性,可用索引等。)

这些都是JOIN;没有必要引入子查询来获取指定的结果集。

答案 1 :(得分:1)

听起来你正在寻找这样的东西。

select A.*, C.veg_type
from A
inner join B
        on A.id = B.object_id
inner join C
        on C.veg_id = B.veg_id_ref

答案 2 :(得分:1)

基本上,只是一对多的关系

蔬菜有多种类型吗?这个例子似乎太简单了,不需要中间表。

select id,name, veg_type
from TableA
inner join TableB on Tablea.id = tableb.object_id
inner join TableC on tableb.veg_id_ref = tablec.id