2013-02-26 6 views
0

У меня есть таблица user и таблица post. Это отношение N-1, что означает, что отношение выполняется через post.user_id.Выберите пользователя, у которого нет сообщения с именем foobar

Я хочу найти пользователей без сообщения с именем «foobar». Я попытался это:

SELECT `users`.* FROM `users` 
INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id` 
WHERE post.title !="foobar" 

Если один пользователь имеет один пост под названием Foobar, он не вернулся, но как только есть postnot имени Foobar пользователь возвращается.

В sql как я могу сказать «Я хочу, чтобы пользователи, у которых нет ни одного сообщения с именем foobar».

ответ

6

Try:

SELECT * 
FROM `users` u 
WHERE NOT EXISTS (
    SELECT 1 
    FROM `posts` 
    WHERE title = 'foobar' 
    AND user_id = u.id 
) 
+0

Вы не связывающую ваш 'НЕ EXISTS' с соответствующим пользователем – Lamak

+0

Oh My ... Спасибо за указание, что вне. –

+0

Хорошо, не объявлено сейчас :-). – Lamak

0

Вы можете присоединиться оставили на столбах с названием Foobar, а затем вернуть все строки, для которых название является недействительным (не было присоединиться возможно).

SELECT `users`.* FROM `users` 
    LEFT JOIN `posts` ON `posts`.`user_id` = `users`.`id` 
     AND posts.title = "foobar" 
WHERE posts.title IS NULL 
0

Мои предпочтения для этих типов запросов является использование агрегации и having:

SELECT `users`.* 
FROM `users` 
INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id` 
group by users.user_id 
having sum(case when post.title = 'foobar' then 1 else 0 end) = 0 
+1

Из любопытства: Почему? Читаемость далеко не оптимальна. Представление ? –

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