首页 > 解决方案 > 当前结果行的 SET 上的 MySQL JOIN 或 SUBQUERY

问题描述

我有一个名为 DEPARTMENTS 的表,它有一个名为 EMPLOYEES 的列,它是一个 SET:

department | employees
----------------------
sales      | 100,107
support    | 120,121

另一个名为 EMPLOYEES 的表:

employee | active
-----------------
100      | true
107      | false
120      | true
121      | true

我试图避免循环遍历结果并建立另一个连接以确定 EMPLOYEE 是否处于活动状态。基本上,我需要另一个包含 ACTIVE 员工的专栏,结果类似于:

department | employees | active
-------------------------------
sales      | 100,107   | 100

我尝试了我认为很明显的方法:

SELECT departments.*, (SELECT GROUP_CONCAT(employee) FROM employees WHERE employee IN(departments.employees) AND active = true) AS active ...

哪个失败了,我不明白为什么,因为如果我手动执行此操作:

SELECT departments.*, (SELECT GROUP_CONCAT(employee) FROM employees WHERE employee IN(100,107) AND active = true) AS active ...

哪个有效。

任何建议表示赞赏:) 似乎是一个简单的问题,但由于某种原因逃离了我..

标签: mysql

解决方案


加入表格并使用 聚合group_concat()
该功能find_in_set()可用于将每个员工链接到每个部门。

假设 in 列的数据active类型employeesBoolean

select d.department, d.employees,
       group_concat(e.employee) active
from departments d left join employees e
on find_in_set(e.employee, d.employees) and e.active
group by d.department, d.employees

请参阅演示

Ifactive的数据类型是varchar更改ON子句:

and e.active = 'true'

请参阅演示

结果:

| department | employees | active  |
| ---------- | --------- | ------- |
| sales      | 100,107   | 100     |
| support    | 120,121   | 120,121 |

推荐阅读