也许我的失败是因为不知道术语,但我希望在两个表上执行 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 |
+---------+----------+
所以问题分为两部分。这 1 步外键查找称为什么,术语,对于 MySQL 来说,这个子查询是什么?此类JOIN
期望的结果是:
+----+------------+------------+
| id | name | cat_type |
+----+------------+------------+
| 1 | veg 1 | Nice |
+----+------------+------------+
| 1 | veg 1 | Rude |
+----+------------+------------+
最佳答案
这看起来像一个多对多的关系。我将 TABLE 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;无需引入子查询即可获取指定的结果集。
关于mysql - 左连接外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17841677/