举个例子:
查询 部门关系表,一个节点id对应着多个部门id
部门表:一个id一个名称
需求就是要查询一个节点id对应的多个部门名称。
查询语句如下:
拆开解释下:
其中主要就是需要注意on后面的连接条件
连表条件用的是 find_in_set(str,strList)>0
find_in_set(str,strList)返回的是str在strList中第一次出现的位置,从1开始,如果返回值大于0,就说明strList中包括了str,也就是上面例子中:departmentId存在在departments这个字段中,把这个作为连表条件,关联表的departments和部门表的id进行关联。
了解下find_in_set(str,strList)的用法:
所以上面用find_in_set(str,strList)的返回值大于0来判断str是否在strList中,用这样的判断来建立连接关系。
再来看select后面的 group_concat(str) 搭配group by使用,是为了name查出来的格式(‘杭州分行,同城支行’)对应着departments的格式(‘002,003’)
在用下图来理解下:group_concat(name)用来合并name(类似列转行),group by 用来按照节点id分组
group_concat(str)如下图,就是有点类似列转行的功能,默认是用逗号分隔