MySQL 多层自引用嵌套联接

mysql multi layered self referencing nested join

提问人:Javohir Mirzo Fazliddinov 提问时间:4/14/2022 最后编辑:Javohir Mirzo Fazliddinov 更新时间:4/14/2022 访问量:325

问:

我有 2 张桌子。 和。tb_devicetb_site_object

tb_device很简单:

| id | station_id |
|----|------------|
| 1  | 6          |
| 2  | 6          |
| 3  | 9          |

tb_site_object看起来像这样:

| id | type    | upper_site_id |
|----|---------|---------------|
| 1  | top     | null          |
| 2  | type2   | 1             |
| 3  | type3   | 2             |
| 4  | station | 3             |
| 5  | top     | null          |
| 6  | station | 5             |

表之间的关系是这样的:当列 in 等于 时,有很多设备。tb_site_objecttypetb_site_objectstation

可以看出,表自我引用本身。带有 type 的行指向另一行 with type 和带有引用的行 with 和 自然,它们也会通过 引用并关闭攀爬循环。 由于行开始链,因此它们始终具有 的值。tb_site_objectstationtype3type3type2topupper_site_idtopnullupper_site_id

有一个 but: 类型可以指向上面的任何类型 破坏电台。station

假设我正确地解释了表格(希望如此),这是我的问题: 我需要进行一个 sql 查询以获取仅给定 的设备。idtb_site_object

因此,如果 id 为 1,我必须爬到 4 并使用 进行连接。如果给定的 ID 为 3,则直接为 4。tb_device

这就是我获取电台的方式:

select
  lvl1.type lvl1_type,
  lvl1.upper_site_id lvl1_upper,
  lvl2.type lvl2_type,
  lvl2.upper_site_id lvl2_upper,
  lvl3.type lvl3_type,
  lvl3.upper_site_id lvl3_upper,
  lvl4.type lvl4_type,
  lvl4.upper_site_id lvl4_upper
from
  tb_site_object as lvl1
  left JOIN tb_site_object lvl2 ON lvl1.id = lvl2.upper_site_id
  left JOIN tb_site_object lvl3 ON lvl2.id = lvl3.upper_site_id
  left JOIN tb_site_object lvl4 ON lvl3.id = lvl4.upper_site_id
where
  lvl1.type = 'business';

tb_devices 中的 EDIT 1 是 tb_site_object 的外键。station_idid

编辑 2 类型列始终以顶部开头,以车站结束。顶部 -> Type2 -> Type3 ->站。只有车站才能上去,提早结束链条

MySQL SQL 嵌套 自联接

评论

0赞 Jon Armstrong 4/14/2022
您的描述不包含对这两个表如何相关的描述。从一个表到另一个表的引用在哪里?你提到“与tb_device一起加入”。解释这些表之间的关系。
0赞 P.Salmon 4/14/2022
哪一行与设备相关?顶部,车站还是其他什么?哪一列与设备相关?是顶级...站总是离散的,总是一个顶部的站?如果有一个没有车站的顶部,你想要什么?可以顶...车站重叠,例如顶部,顶部,车站,顶部?
1赞 P.Salmon 4/14/2022
可能是递归是合适的,你使用的是哪个版本的mysql?
0赞 Javohir Mirzo Fazliddinov 4/14/2022
station_idtb_devices中的列指向 tb_site_object @JonArmstrongid
1赞 CarlosSR 4/14/2022
你一定要看看 stackoverflow.com/questions/20215744/......

答: 暂无答案