2014-02-10 3 views
0

У меня есть следующий 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).

Это может показаться простым, но я борюсь.

Примеры:

Если я использую ИЛИ следующие люди со следующими навыками (1,2,71) возвращаются (люди без возможности 695) Если я использую И следующие человек со следующими навыками (71, 695) не возвращаются

Спасибо!

+0

Некоторые замечания по вашему собственному запросу: 1. Выберите DISTINCT очень часто признак плохого запроса - вы выбираете дубликаты, а затем вам нужно удалить их. Зачем вам внешнее соединение? Вам нужны только фрилансеры с такими навыками, поэтому зачем включать лиц, которые не являются фрилансерами, почему включают фрилансеров, у которых нет желаемых навыков? Предложение where снова удаляет все эти записи. И почему вы даже присоединяетесь к cp_habilidade, когда cp_habilidade_freelancer.id_habilidade уже содержит информацию, которую вы ищете? –

+0

@ThorstenKettner запрос является частью другого – user4919

ответ

1

Это домашнее задание? Если это так, идея должна быть достаточной: вы ищете людей, где количество связанных навыков 71 и 695 равно 2.

В случае, если это не домашнее задание, а реальная задача, тогда скажите мне об этом, и я дать вам полное выражение SQL :-)

EDIT: прямой способ, чтобы спросить, если существуют оба навыка для человека:

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 
); 

Вы можете изменить счетчик (отдельный id_habilidade) для подсчета (*), если будет гарантировано отсутствие дублирующих навыков для id_freelancer в cp_habilidade_freelancer.

+0

Это настоящая задача :) – user4919

+0

Хорошо. Из вашего комментария к другому ответу, я понимаю, что вы не ищете «лиц, обладающих навыками 71 и 695», но для «лиц, обладающих навыками 71 и 695 и других навыков». Верный? –

+0

Нет, у человека могут быть навыки других, но 71 и 695 обязательны. – user4919

Смежные вопросы