PHP-仅在找不到匹配项时返回MySQL

我在处理复杂的MySQL查询时遇到问题:

一个表包含所有ID(项目ID)的行,另一表包含已查看的项目的“ 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”,也可以不等于“ 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(来自项目表)和project_id(来自projects_viewed表)之间匹配,或者仅存在projects_viewed中的匹配项用户名不是我们要查询用户名(本例中为“ SomeOneElse”).

因此,在此示例中,仅应返回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'
)

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...