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

时间:2015-02-23 18:10:08

标签: mysql

假设我有一个包含两列的MySQL表照片:" url"和" owner_id。"我有另一张表 unfollowed_user ,其中有两个列:"取消关注"和#34;收件人。"

我正在尝试创建一个 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的任何一张照片,因为有两行取消跟随者!= 3.

那么如何添加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正在暗杀每张照片的所有者?

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

0 个答案:

没有答案