日常中遇到的mysql问题(长期更新)

  |   0浏览

1. mysql一个字段多个值关联另一张

假设表group:

id  group_namenode_id 
1113,11,16,159

表node:

idip
131.1.1.1
112.2.2.2
163.3.3.3
1594.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的值]                            

原文地址:https://blog.51cto.com/linzb/2507281