如何正确关联MySQL中phy与VM表以获取预期查询结果?
MySQL表查询调整方案
你当前使用的SQL存在两个明显问题:
- 重复选取了
vm.mem字段,导致结果中出现两个完全相同的内存列 - 默认的
INNER JOIN只会返回两张表中ip完全匹配的记录,若物理机无对应虚拟机、或虚拟机无对应物理机的记录都会被过滤
以下是几种常见的调整方向,你可根据实际预期结果选择:
1. 保留所有物理机,关联显示对应虚拟机(无虚拟机的物理机也显示)
用LEFT JOIN替代INNER JOIN,同时修正重复字段问题:
SELECT phy.ip, phy.name, phy.brand, vm.mem FROM phy LEFT JOIN vm ON phy.ip = vm.ip;
2. 保留所有虚拟机,关联显示对应物理机(无对应物理机的虚拟机也显示)
用RIGHT JOIN实现:
SELECT vm.ip, phy.name, phy.brand, vm.mem FROM phy RIGHT JOIN vm ON phy.ip = vm.ip;
3. 显示所有物理机和虚拟机的关联关系(包含两边无匹配的记录)
MySQL不直接支持FULL JOIN,可通过UNION组合左右连接结果:
SELECT phy.ip, phy.name, phy.brand, vm.mem FROM phy LEFT JOIN vm ON phy.ip = vm.ip UNION SELECT vm.ip, phy.name, phy.brand, vm.mem FROM phy RIGHT JOIN vm ON phy.ip = vm.ip;
4. 区分物理机与虚拟机的内存字段(若phy表也有mem字段)
明确指定字段并添加别名:
SELECT phy.ip, phy.name, phy.brand, phy.mem AS phy_mem, vm.mem AS vm_mem FROM phy JOIN vm ON phy.ip = vm.ip;
若以上方案仍不符合预期,请补充说明:
- 两张表的具体字段结构
- 你期望的查询结果样式(比如需包含的字段、是否保留无关联记录等)
内容的提问来源于stack exchange,提问作者arieffirdaus
相关产品推荐
相关产品推荐

