mysql - 左连接外键

标签 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     |
+---------+----------+

所以问题分为两部分。这 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/

相关文章:

mysql - 防止 mysql 查询给出多行相同的 id

sql - 创建插入查询(外键约束错误)

mysql - JOIN(表名)

SQL,左连接表,如何只保留一个值?

mysql - 如何在perl中处理utf字符

mysql - 在 MYSQL LOAD DATA INFILE 中参数化文件名

python - 将数千条记录插入表中的最有效方法是什么(MySQL、Python、Django)

sql - 使用表名、字段名和模式名查找引用的表名

mysql - 如何从表中删除外键?

mysql - 具有匹配值且最新为正的最新记录