Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL仅在未找到匹配项时返回_Php_Mysql_Join - Fatal编程技术网

Php MySQL仅在未找到匹配项时返回

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

我在处理复杂的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.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'
)

谢谢,我现在明白了连接的工作原理。非常感谢你的帮助!我认为连接看起来更令人困惑,所以很高兴看到另一种解决方法。