使用数组进行SQL过滤

时间:2014-04-02 08:37:04

标签: mysql sql filter group-concat

我的数据库中有以下表格:

表:员工

ID      Name
--      ----
1       Mike
2       Peter
3       Daniel

表:位置

EmployeeID      City
----------      ----
1               Berlin
1               Stuttgart
1               München
2               Hamburg
3               Stuttgart
3               Berlin

Employee表包含有关员工的信息。 “位置”表包含有关员工所在项目的位置的信息(例如Mike在柏林,斯图加特和慕尼黑的项目)。

我现在要做的是按照阵列中的给定位置过滤员工,但仍然检索每个员工的所有位置。例如,按数组["Berlin", Stuttgart]过滤应返回以下结果:

ID      Name      City
--      ----      ----
1       Mike      Berlin, Stuttgart, München
3       Daniel    Stuttgart, Berlin

我知道我可以使用GROUP_CONCAT()来连接位置。但是我该如何进行过滤呢?我需要能够使用SQL来完成它。

2 个答案:

答案 0 :(得分:3)

应用WHERE条件从EmployeeID表中获取Location

SELECT 
  Employee.*, 
  GROUP_CONCAT(Location.City) 
FROM 
  Employee 
    INNER JOIN Location 
      ON Employee.ID=Location.EmployeeID 
    INNER JOIN 
      (SELECT DISTINCT 
        EmployeeID 
       FROM 
         Location 
       WHERE 
         City IN ('Berlin', 'Stuttgart')) AS IDS
      ON Employee.ID=IDS.EmployeeID
GROUP BY 
  Employee.ID

- 检查fiddle

替代解决方案是使用HAVING子句与普通查询和INSTR(),但我不建议您这样做,因为HAVING中的比较会很慢,此外,值列表将产生多重比较。

答案 1 :(得分:0)

您可以使用以下查询:

SELECT 
a.id,a.`name`,GROUP_CONCAT(b.city) 
FROM employee a 
JOIN 
(SELECT DISTINCT employeeid,city FROM location WHERE location IN ('Berlin', 'Stuttgart')) b
ON a.id=b.employeeid 
GROUP BY a.id;