也许我的失败是不知道术语,但我希望在两个表上执行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 |
+----+------------+------------+
答案 0 :(得分:2)
这看起来像是多对多的关系。我将表B称为"关联"表(或者,有时是"关系"表,在某些情况下,这可以称为"成员资格"表。)
从数据库设计的角度来看,我们进行了实体关系建模"。一个"实体"是一个可以唯一识别的人,地点,事物,概念或事件,是企业感兴趣的,我们可以存储有关的信息。我们有"关系"这些实体之间。当我们确定了一个关系时,我们会问正确的问题,找出一个实体与另一个实体有多少相关。
在您的示例中,看起来B实现了实体A和C之间的关联。
(这是识别实体的合适名称可以使模型更容易理解的地方。)
为了解决多对多问题,我们实现了第三个表格,我们可以将其命名为" A_C"或" C_A",或者它可能有一个完全不同的名称。 (例如," COMMITTEE"和" PERSON"之间的关联可能被称为"会员")。
在您的示例中,新表名为" 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