查询语句:
SELECT
k.title AS "知识标题",
kc.categoryName AS "分类",
k.updateTime AS "更新时间",
k.employeeName AS "创建人",
(
SELECT
group_concat( employeeName )
FROM
employee
WHERE id in(substring( k.viewEmployeeIds, 2, length( k.viewEmployeeIds )- 2 ))) AS "可见人"
FROM
knowledge k
LEFT JOIN knowledgecategory kc ON k.knowledgeCategoryId = kc.id
WHERE
k.companyId = 981
AND k.isDeleted = 0;
查询结果如下:
子查询的查询结果如下
但是意外的是,当我进行整体的查询时,只查出了一条数据
而我将结果直接放入时,结果有6条数据
原因:
子查询中使用GROUP_CONCAT函数作为条件返回,mysql会将结果当成字符串处理,而in的分割方法是以**","**为分割的,当返回条件做完一个字符串传入时,其中的,会被当成一个字符处理,从而MySQL会自动的判断字符串的第一个是否匹配,但是后面的就截掉了 没有进行匹配!,只能查出符合第一个的数据。
解决方案:
使用find_in_set函数 替代in的使用
修改之后的sql如下:
SELECT
k.title AS "知识标题",
kc.categoryName AS "分类",
k.updateTime AS "更新时间",
k.employeeName AS "创建人",
(
SELECT
group_concat( employeeName )
FROM
employee
WHERE companyId = 981 AND
FIND_IN_SET(id, substring( k.viewEmployeeIds, 2, length( k.viewEmployeeIds )- 2 ))) AS "可见人",
substring( k.viewEmployeeIds, 2, length( k.viewEmployeeIds )- 2 ) as "可见人Ids"
FROM
knowledge k
LEFT JOIN knowledgecategory kc ON k.knowledgeCategoryId = kc.id
WHERE
k.companyId = 981
AND k.isDeleted = 0;
修改之后即可查出所有的数据。
注解补充:
find_in_set 函数的使用及其原理:
find_in_set(a,x):a为某个字符串或字段,x为一个字符串,当a在x了里面时会满足条件