【问题标题】:MySQL only return if no matches foundMySQL 仅在未找到匹配项时返回
【发布时间】:2016-03-13 00:54:43
【问题描述】:

我遇到了复杂的 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”,因为“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在 projects_viewed 中的用户名不是我们查询时使用的用户名(在本例中为“SomeOneElse”)。

所以在这个例子中,应该只返回 id 的 1、3 和 5。

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

    您正在否定您的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'
    )
    

    【讨论】:

    • 谢谢,我现在了解连接的工作原理。非常感谢您的帮助!
    • 我认为连接似乎更令人困惑,所以很高兴看到另一种解决方法。
    猜你喜欢
    • 2016-12-28
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多