MySQL两表关联替换字段咨询:是否需创建中间表实现?
解决方案:直接通过表关联实现URL映射,无需第三张表
Hey there! 你的需求完全可以直接实现,根本不需要额外创建第三张表来存储在线/离线URL。咱们只需要利用MySQL的表关联功能,就能把status表的id和status字段直接映射到cis表对应的URL上。
需求拆解
先明确一下映射逻辑:
status表的id字段 → 匹配cis表中id相同的url(比如status.id=1对应cis.id=1的img/server1.png)status表的status字段 → 匹配cis表中id等于该状态值的url(比如status.status=0对应cis.id=0的img/offline.png,status=999对应cis.id=999的img/online.png)
实现方法1:两次LEFT JOIN(推荐)
这种方法性能更优,尤其是当cis表数据量较大时:
SELECT c1.url AS id_mapped_url, c2.url AS status_mapped_url FROM status s LEFT JOIN cis c1 ON s.id = c1.id LEFT JOIN cis c2 ON s.status = c2.id;
语句解释
- 我们将
status表和cis表做两次关联:- 第一次用
status.id匹配cis.id,获取id对应的URL,命名为id_mapped_url - 第二次用
status.status匹配cis.id,获取状态对应的URL,命名为status_mapped_url
- 第一次用
- 使用
LEFT JOIN可以确保即使status表中某个id或status值在cis表中没有匹配项,也不会丢失原有的记录。
实现方法2:子查询(简洁版)
如果你的数据量不大,也可以用子查询的方式,写法更直观:
SELECT (SELECT url FROM cis WHERE id = s.id) AS id_mapped_url, (SELECT url FROM cis WHERE id = s.status) AS status_mapped_url FROM status s;
预期查询结果
根据你提供的测试数据,两种方法都会返回如下结果:
| id_mapped_url | status_mapped_url |
|---|---|
| img/server1.png | img/offline.png |
| img/server2.png | img/online.png |
| img/server3.png | img/online.png |
| img/server4.png | img/offline.png |
总结
完全不需要创建第三张表,直接通过表关联就能完成你需要的字段映射需求。如果追求性能,优先选择LEFT JOIN的方式;如果更看重代码简洁性,子查询也是不错的选择。
内容的提问来源于stack exchange,提问作者Dymas
相关产品推荐
相关产品推荐

