Mysql 外键上的左连接

Mysql 外键上的左连接,mysql,foreign-keys,left-join,primary-key,Mysql,Foreign Keys,Left Join,Primary Key,也许我的失败是不知道术语,但我希望在两个表上执行连接,另一个表作为外键 因此,表A上某个项的id用于从表B获取外键,该外键用于从表C获取文本表示 TABLE A +----+------------+ | id | name | +----+------------+ | 1 | comment | +----+------------+ TABLE B +-----------+------------------+ | object_id | cat_id_ref

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

因此,表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     |
+---------+----------+
所以问题是第二部分。这一步外键查找叫做什么,术语,MySQL的子查询是什么?此类型的
连接的最佳实践

预期的结果将是:

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

听起来你在找这样的东西

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

听起来你在找这样的东西

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

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

一种蔬菜可以有一种以上的类型吗?这个例子似乎太简单了,不需要中间的表

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

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

一种蔬菜可以有一种以上的类型吗?这个例子似乎太简单了,不需要中间的表

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

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

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

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

  • “A”可以与零、一个或多个“C”相关
  • “C”可以与零、一个或多个“A”相关
(在这一点上,使用合适的名称来标识实体可以使模型更易于理解。)

为了解决多对多问题,我们实现了第三个表,我们可以将其命名为“a_C”或“C_a”,也可以使用完全不同的名称。(例如,“委员会”和“人”之间的联系可以称为“成员”)

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

  • A“B”正好与一个“A”相关
  • A“B”正好与一个“C”相关
  • “A”与零、一个或多个“B”相关
  • A“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中没有“匹配”行。其他差异是性能,具体取决于基数、选择性、可用索引等)


这些都是连接;不需要引入子查询来获取指定的结果集。

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

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

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

  • “A”可以与零、一个或多个“C”相关
  • “C”可以与零、一个或多个“A”相关
(在这一点上,使用合适的名称来标识实体可以使模型更易于理解。)

为了解决多对多问题,我们实现了第三个表,我们可以将其命名为“a_C”或“C_a”,也可以使用完全不同的名称(例如,“委员会”和“个人”之间的关联可以称为“成员”)

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

  • A“B”正好与一个“A”相关
  • A“B”正好与一个“C”相关
  • “A”与零、一个或多个“B”相关
  • A“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中没有“匹配”行。其他差异是性能,具体取决于基数、选择性、可用索引等)


这些都是连接;不需要引入子查询来获得指定的结果集。

yes,
Veg1
可以有几种类型(提供的数据不是最佳示例)编辑操作以反映yes,
Veg1
可以有几种类型(提供的数据不是最佳示例