从MySQL查询中排除结果并试图避免O(n^2)查询?

从MySQL查询中排除结果并试图避免O(n^2)查询?,mysql,Mysql,假设我有一张MySQL表格照片,有两列:“url”和“owner\u id”。我还有一张表格unfollowed\u user,有两列:“unfollower”和“recipient” 我正在尝试创建一个O(n)MySQL查询,该查询从特定站点用户的照片表中选择所有照片,但排除用户“未跟踪”的所有者的所有照片 以下是我迄今为止所尝试的: SELECT p.url FROM photo p LEFT JOIN unfollowed_user u ON p.owner_id = u.recipie

假设我有一张MySQL表格照片,有两列:“url”和“owner\u id”。我还有一张表格unfollowed\u user,有两列:“unfollower”和“recipient”

我正在尝试创建一个O(n)MySQL查询,该查询从特定站点用户的照片表中选择所有照片,但排除用户“未跟踪”的所有者的所有照片

以下是我迄今为止所尝试的:

SELECT p.url FROM photo p LEFT JOIN unfollowed_user u ON 
p.owner_id = u.recipient WHERE recipient IS NULL;
这确实会返回任何照片并排除所有者已取消跟踪的任何照片,但它会排除任何用户已“取消跟踪”的所有者的所有照片,而不仅仅是在特定用户取消跟踪时

那么:

SELECT p.url FROM photo p LEFT JOIN unfollowed_user u ON 
p.owner_id = u.recipient WHERE recipient (IS NULL OR unfollower != ?);
(为用户提供特定的服务?)

这将返回重复的结果,因为如果其他用户(不是我们的特定用户)取消了照片所有者的跟踪,它将创建一个新行。如果用户1和2有未跟随的用户10,则用户3将两次获得用户10的任何照片,因为有两行未跟随的用户!=三,

那么,添加一个SELECT DISTINCT如何:

SELECT DISTINCT p.url FROM photo p LEFT JOIN unfollowed_user u ON 
p.owner_id = u.recipient WHERE recipient (IS NULL OR unfollower != ?);
这修复了重复条目的问题,但引发了另一个问题。假设用户3和4都有未跟随的用户10。用户10的任何照片都将在第一时间被忽略,因为用户3已经取消了用户10的跟踪。然而,这些照片也将被包括在内,因为不是用户3的人有未跟随的用户10

好,好。我知道显而易见的选择是

SELECT p.url FROM photo p WHERE owner_id NOT IN 
(SELECT recipient FROM  unfollowed_user u WHERE unfollower = ?);
但是对于大型数据集,这有O(n^2),对吗?MySQL正在子查询每张照片的所有者


任何帮助、提示、有用的文章或博客文章等都将不胜感激。

最终版本不是O(n^2)。还是两个问题。一个是获取
收件人
值,然后使用这些值从照片表中筛选出未命名的记录。如果该子查询使用了来自另一个查询的值(例如,一个相关的子查询),那么它只能是o(n^2)。这是一种解脱。那么,MySQL“不在”解决方案是否合理(且合理有效)呢?当然,这取决于子查询返回的结果数量。