2015-03-24 4 views
0

У меня есть один стол «люди».SELECT, если левое соединение IS IS IS NOT (MYSQL)?

Другой с «hobbiesConnection», и они связаны как OneToMany.

Я хотел бы построить поиск, где можно искать людей, которые имеют хобби и не имеют хобби.

Что-то вроде:

SELECT * FROM people 
LEFT JOIN hobbiesConnection ON hobbiesConnection.people_id = 
hobbiesConnection.hobby_id 
WHERE hobby_id = 4 AND hobby_id != 5 

Теперь я получаю человек с хобби 4, но я хочу, чтобы получить пустой результат, потому что оба условия должны соответствовать лицу.

Есть ли у кого-нибудь идеи, как это сделать?

+0

Изменить, где и как. Изменить и на или. Вам могут понадобиться скобки – Strawberry

+1

показать образцы данных. – Jens

+1

Условие 'WHERE' удовлетворено только значением' 4' 'hobby_id'. Элемент 'AND hobby_id! = 5' является избыточным; вы можете спокойно отказаться от него. – axiac

ответ

0

Во-первых, ваш РЕГИСТРИРУЙТЕСЬ не является правильным. Две таблицы должны быть связаны с внешним ключом/общим столбцом. Попробуйте выполнить следующий запрос;

SELECT * FROM people 
LEFT JOIN hobbiesConnection 
ON hobbiesConnection.people_id = people.people_id 
And (hobbiesConnection.hobby_id = 4 AND hobbiesConnection.hobby_id != 5) 
+0

Это, спасибо :) – abcNocturn

+0

вы отредактировали ответ - теперь его corerect. Я все еще думаю, что весь запрос неверен - рассмотрим пример данных, выполняемых по вашему запросу: http://sqlfiddle.com/#!9/d9926/5 он возвращает строку для people_id 1 (у которой есть хобби 5, поэтому он должен " t be here), а для people_id = 3 (у которого нет хобби 4 - поэтому он тоже не должен быть здесь) – murison

-1

использование (NOT) СУЩЕСТВУЕТ пункт:

SELECT * FROM people p 
WHERE TRUE 
AND EXISTS (
    SELECT TRUE FROM hobbiesConnection hc 
    WHERE hc.people_id = p.people_id -- or p.id? you didnt mention 
    AND hobby_id = 4 
) 
AND NOT EXISTS (
    SELECT TRUE FROM hobbiesConnection hc 
    WHERE hc.people_id = p.people_id -- or p.id? you didnt mention 
    AND hobby_id = 5 
) 

Вы можете достичь того же с помощью присоединяется

SELECT p.* 
FROM people p 
JOIN hobbiesConnection h4 ON TRUE 
    AND h4.people_id = p.people_id -- or p.id? you didnt mention 
    AND h4.hobby_id = 4 
LEFT JOIN hobbiesConnection h5 ON TRUE 
    AND h5.people_id = p.people_id -- or p.id? you didnt mention 
    AND h5.hobby_id = 5 
WHERE h5.id IS NULL -- or whatever column from that table 

посмотреть на скрипку: http://sqlfiddle.com/#!9/d9926/4