日常中遇到的mysql问题(长期更新)
1. mysql一个字段多个值关联另一张表
假设表group:
id | group_name | node_id |
1 | 1 | 13,11,16,159 |
表node:
id | ip |
13 | 1.1.1.1 |
11 | 2.2.2.2 |
16 | 3.3.3.3 |
159 | 4.4.4.4 |
需求:查找出表group中node_id对应的ip
语句:
select t.group_name, (select GROUP_CONCAT(a.ip) from node a where FIND_IN_SET(a.id,t.node_id))nodeip from group t ;
执行结果:
+-----+-------------------------------
| 1 | 1.1.1.1,2.2.2.2,3.3.3.3,4.4.4.4 |
解释:
GROUP_CONCAT 这个函数作用是把相同的数据放在一起,因为源数据13,11,16,159 要替换成对应的ip,而且保持在一起,所以 用 GROUP_CONCAT(a.ip),[a是node表,后面的node a ,代表把node别名为a,这是为了多次使用可以简写的缘故 ]
FIND_IN_SET 这个函数是这个语句的关键所在,普通的FIND_IN_SET作用如下:
SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
SELECT FIND_IN_SET('e','a,b,c,d');
-> 0
如果第一个字段在第二个字段里面有值,则返回对应位置,没有则返回0
配合where,where FIND_IN_SET(a.id,t.node_id) 就可以解释为,a表id在t表中的node_id有值,限定了查找范围
所以整个语句大概可以这么解释:
从表group中查找 group_name,nodeip(当node表中的id在group表中的node_id有值的时候,查找对应ip放在一起) 、
[()里面是子语句,它的执行结果作为nodeip的值]