【发布时间】:2015-12-29 07:29:10
【问题描述】:
我编写了一个过滤器,它生成一个查询来显示特殊员工。
我有表员工和很多 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,但我遇到的问题是我无法过滤超过 2 年的 find_in_set 经验,并且 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
我想操纵查询使其工作。
查询必须如何处理关系划分。
【问题讨论】:
-
帮自己一个忙,不要这样命名您的联合表 (
emp_ski)。使用清晰/有意义的内容,例如employee_skills或employee_to_skills。你以后会很高兴的。 -
字段
experience应该在Emp_Ski表中 -
数据库很大很复杂,这只是一个小例子来解释我的问题。