php - 关系划分SQL

标签 php mysql sql

我编写了一个过滤器,它生成一个查询以显示特殊员工。

我有表员工和很多 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/

相关文章:

php - if 语句对空变量说真

PHP PDO - 带 WHERE 的 MySQL INSERT

SQL 创建日志

SQL服务器: need to escape [?

php - Helper 与 Model 交互可以吗?

php - PHP什么时候不一次性输出页面?

java - 当级联操作在 SGBD 中完全映射时,我应该在 hibernate 中映射级联操作吗?

php - 选择将在其中返回新位置列的查询

mysql - 使用mysql插入具有不同条件的一个字段值

javascript - 为什么我的表单按钮中的数据无法发送到我的 PHP 服务器?