项目场景:
mysql 有A和B甚至更多表,根据A表的某一个字段在其他表中查找相关字段数据。实现例如 id转中文字符灯需求。
问题描述
例如:
A表中字段:
;
+----+-------+--------+
| id | age | typeId |
+----+-------+--------+
| 1asd | 18 | 1 |
+----+-------+--------+
B表中字段”
;
+----+-------+--------+
| id | Aid | name|
+----+-------+--------+
| 1 | 1asd | 小何|
+----+-------+--------+
现在要根据A表的id查出,改id下的所有人的中文名。在B表中Aid对应的就是A表的id;
实现效果如下:
+----+-------+--------+--------+--------+
| id | age | typeId |Aid | name |
+----+-------+--------+--------+--------+
| 1asd | 18 | 1 |1asd | 小何 |
+----+-------+--------+--------+--------+
原因分析:
设计多表查询,这里回用到JOIN语句
根据具体情况不同选择适当的JOIN语句,他们的区别如下:
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行
在这里我们选择LEFT JOIN实现
解决方案:
在联合查询的过程中若存在字段名相同的情况下,需要对表AS 单独命名。也可以省略as
left join 和group by 连用 可以对限定字段名进行相同查询
select a.id,a.age,a.typeId,b.name from A as a
left join (select id,Aid,name from B group by Aid) as b on a.id=b.Aid
这样就实现了id转换中文,那么对B中的数据进行查询,且对B对应的字段名AS重命名后 要注意,在where查询中要使用原有的字段名。
select a.id,a.age,a.typeId,b.name AS "getName" from A as a
left join (select id,Aid,name from B group by Aid) as b on a.id=b.Aid
--要使用原有的字段名
where b.name ='xxxx'