我有以下sql:
SELECT DISTINCT cp_pessoa.id, cp_pessoa.nome
FROM cp_pessoa
LEFT JOIN cp_habilidade_freelancer ON (cp_habilidade_freelancer.id_freelancer = cp_pessoa.id)
LEFT JOIN cp_habilidade ON (cp_habilidade.id = cp_habilidade_freelancer.id_habilidade)
WHERE cp_habilidade.id = 71 OR cp_habilidade.id = 695
LIMIT 0, 10
我只想要拥有所有技能的人(cp_pessoa)(71,695)。
看起来很简单,但我很挣扎。
示例:
如果我使用OR,则返回具有以下技能的下列人员(1,2,71)(没有能力的人695) 如果我使用AND,则不会返回具有以下技能的以下人员(71,695)
答案 0 :(得分:1)
这是家庭作业吗?如果是这样,这个想法应该足够了:你正在寻找那些关联技能71和695的数量为2的人。
如果这不是作业,而是一项真正的任务,请告诉我,我会给你一个完整的SQL声明: - )
编辑:直截了当的方式是询问一个人是否存在这两种技能:
select id, nome
from cp_pessoa p
where exists
(
select *
from cp_habilidade_freelancer hf
where hf.id_freelancer = p.id
and hf.id_habilidade = 71
)
and exists
(
select *
from cp_habilidade_freelancer hf
where hf.id_freelancer = p.id
and hf.id_habilidade = 695
);
另一种方法是只查询一次cp_habilidade_freelancer:
select id, nome
from cp_pessoa p
where id in
(
select id_freelancer
from cp_habilidade_freelancer hf
where id_habilidade in (71, 695)
group by id_freelancer
having count(distinct id_habilidade) = 2
);
如果确保cp_habilidade_freelancer中的id_freelancer没有重复技能,您可以将count(distinct id_habilidade)更改为count(*)。