如果找不到匹配项,MySQL仅返回

时间:2016-03-13 00:54:44

标签: php mysql join

我遇到了复杂的MySQL查询问题:

一个表包含ALL id的行(项目ID' s),另一个表包含" 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可以与#34; 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"然后我想从项目表中返回所有id。如果id(来自projects表)和project_id(来自projects_viewed表)之间没有匹配,或者project_viewed中唯一的那些具有用户名这不是我们要查询的用户名(" SomeOneElse"在这种情况下)。

因此,在此示例中,只应返回id的1,3和5。

1 个答案:

答案 0 :(得分: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'
)