我有以下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


我只想要具备所有技能(71、695)的人(cp_pessoa)。

看起来似乎很简单,但是我很挣扎。

例子:

如果我使用OR,则会返回具有以下技能(1,2,71)的以下人员(无能力695的人员)
如果我使用AND,则不会返回具有以下技能(71、695)的以下人员

最佳答案

这是作业吗?如果是这样,这个主意就足够了:您正在寻找相关技能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
);


您可以将count(distinct id_habilidade)更改为count(*),以确保cp_habilidade_freelancer中没有id_freelancer重复的技能。

关于mysql - 检查一列中是否有多个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21672885/

10-12 04:42