我编写了一个过滤器,它生成一个查询以显示特殊员工。
我有表员工和很多 1:1、1:n 和 n:m 关系,例如像这样为员工提供技能和语言:
Employees
id name
1 John
2 Mike
Skills
id skill experience
1 PHP 3
2 SQL 1
Employee_Skills
eid sid
1 1
1 2
现在我想筛选至少有 2 年 PHP 使用经验和 1 年 SQL 使用经验的员工。
我的过滤器总是为每个表、关系和字段生成正确的工作查询。
但现在我的问题是,当我想使用 a 多次过滤相关表中的同一字段时,它不起作用。
e.g.
John PHP 3
John SQL 1
PHP 和 SQL 是不同的行,所以 AND 不能工作。
我尝试使用 group_concat 和 find_in_set,但我遇到的问题是我无法使用 find_in_set 筛选超过 2 年的经验,而 find_in_set 不知道 PHP 是 3 而 SQL 是 1。
我也试过
WHERE emp.id IN (SELECT eid FROM Employee_Skills WHERE sid IN (SELECT id FROM Skills WHERE skill = 'PHP' AND experience > 1)) AND emp.id IN (SELECT eid FROM Employee_Skills WHERE sid IN (SELECT id FROM Skills WHERE skill = 'SQL' AND experience > 0))
它适用于这个例子,但它只适用于 n:m 并且它太复杂以至于无法知道关系类型。
我有最终的查询
ski.skill = 'PHP' AND ski.experience > 1 AND ski.skill = 'SQL' AND ski.experience > 0
我想操纵查询使其工作。
处理关系划分的查询必须是什么样子。
最佳答案
您可以尝试下一种方法:
select * from Employees
where id in (
select eid
from Employee_Skills as a
inner join
Skills as ski
on (a.sid = ski.id)
where
(ski.skill = 'PHP' AND a.experience > 2) OR
(ski.skill = 'SQL' AND a.experience > 1)
group by eid
having count(*) = 2
)
因此,对于每个过滤器,您将添加 OR 语句,having
将过滤所有已通过过滤器的员工,只需传递适当的数字
关于php - 关系划分SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501288/