2016-03-13 3 views
3

У меня возникли проблемы с сложным запросом MySQL:MySQL возвращать только если совпадений не найдено

Одна таблица содержит строки всех идентификаторов (проект идентификаторам), а другая таблица содержит «PROJECT_ID» ы проектов, которые были рассматривается. Поэтому мне нужно получить все ID, которые НЕ были просмотрены этим пользователем, но, возможно, были просмотрены другими пользователями.

Это код запроса, который не может в данный момент:

SELECT p.id FROM projects p 
LEFT JOIN projects_viewed pv ON p.id = pv.project_id 
WHERE NOT pv.username = 'SomeOneElse'; 

Это будет работать, но я думаю, что это возможно, потому что провал p.username может быть равна, а также не равны, чтобы «SomeOneElse» потому что «pv.project_id» не уникален, как упоминалось ранее.

Вот пример, учитывая, что начальные значения, как следует:

INSERT INTO `projects` (`id`) VALUES 
(1), (2), (3), (4), (5); 

INSERT INTO `projects_viewed` (`project_id`, `username`,) VALUES 
(1, 'Billy'), 
(2, 'SomeOneElse'), 
(2, 'Billy'), 
(3, 'Billy'), 
(4, 'SomeOneElse'), 
(4, 'Billy'), 
(5, 'Billy'), 

Если имя пользователя было «SomeOneElse», то я хочу, чтобы вернуть все идентификаторы из таблицы проектов, если нет совпадений между идентификатором (от таблица проектов) и project_id (из таблицы projects_viewed), или только те, которые находятся в project_viewed, имеют имя пользователя, которое не является именем пользователя, с которым мы запрашиваем (в данном случае - «SomeOneElse»).

Поэтому, учитывая этот пример, должны быть возвращены только идентификаторы 1, 3 и 5.

ответ

4

Вы отрицаете свой outer join. Вы можете перемещать, что критерии к join, а затем проверить null:

select p.id 
from projects p 
    left join projects_viewed pv on 
     p.id = pv.project_id and 
     pv.username = 'SomeOneElse' 
where pv.project_id is null 

Или, вы можете использовать not exists для этого:

select * 
from projects p 
where not exists (
    select 1 
    from projects_viewed pv 
    where p.id = pv.project_id and 
      pv.username = 'SomeOneElse' 
) 
+0

Спасибо, я понимаю, как стыки работу в настоящее время. Очень ценю помощь! – Mayron

+0

Я думаю, что объединения кажутся более запутанными, поэтому приятно видеть другой путь вокруг него. – Mayron

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