0

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

所以表 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       |
+----+------------+------------+
4

3 回答 3

2

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

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

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

  • “A”可以与零个、一个或多个“C”相关。
  • 一个“C”可以与零个、一个或多个“A”相关。

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

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

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

  • 一个“B”与一个“A”正好相关
  • 一个“B”与一个“C”正好相关
  • 一个“A”与零个、一个或多个“B”相关
  • 一个“C”与零个、一个或多个“B”有关

“B”表的引入将多对多关系解析为两个“一对多”关系。

(看起来您已经了解外键如何在关系的“多”端出现在表上,以及它如何引用“单”端实体表的主键(或唯一键)关系的:外键的值是另一个表的主键值的副本。)


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

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 中的行在表 B 中没有“匹配”行。其他区别是性能,取决于基数、选择性、可用索引等)

这些都是JOIN;无需引入子查询来获取指定的结果集。

于 2013-07-24T18:25:13.110 回答
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
于 2013-07-24T18:20:36.247 回答
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
于 2013-07-24T18:21:19.490 回答