假设我有一个包含两列的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正在暗杀每张照片的所有者?
任何帮助,指示,有用的文章或博客文章等都将不胜感激。