Php MySQL仅在未找到匹配项时返回
我在处理复杂的MySQL查询时遇到问题: 一个表包含所有id(项目id)的行,另一个表包含已查看项目的“项目id”。因此,我需要获取该用户尚未查看的所有ID,但可能已被其他用户查看 这是目前失败的代码查询:Php MySQL仅在未找到匹配项时返回,php,mysql,join,Php,Mysql,Join,我在处理复杂的MySQL查询时遇到问题: 一个表包含所有id(项目id)的行,另一个表包含已查看项目的“项目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.user
SELECT p.id FROM projects p
LEFT JOIN projects_viewed pv ON p.id = pv.project_id
WHERE NOT pv.username = 'SomeOneElse';
这是可行的,但我认为它可能会失败,因为p.username可以与“someonether”相等,也可以不相等,因为“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'),
如果用户名是“someonether”,那么如果在id(来自projects表)和project_id(来自projects_查看的表)之间找不到匹配项,或者projects_查看的表中只有一个用户名不是我们查询的用户名(“someonether”)
因此,在这个示例中,只应返回id的1、3和5。您正在否定您的
外部联接。您可以将该条件移动到连接
,然后检查空值
:
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
或者,您可以为此使用不存在
:
select *
from projects p
where not exists (
select 1
from projects_viewed pv
where p.id = pv.project_id and
pv.username = 'SomeOneElse'
)
谢谢,我现在明白了连接的工作原理。非常感谢你的帮助!我认为连接看起来更令人困惑,所以很高兴看到另一种解决方法。