这个问题在这里已经有答案了:
连接中的否定条件(3个答案)
两年前关门了。
无法正确描述标题中的问题,抱歉。假设,我有两个表a(id,其他列)和b(id,a\u id,其他列),其中a\u id是表的外键。a有大约10000张唱片,b有大约一百万张唱片。我需要从a中选择随机记录,它在表b中没有关系。可以这样做:
SELECT * FROM (SELECT A.id, B.id as b_id FROM A LEFT JOIN B ON B.a_id = A.id ORDER BY RAND()) tmp WHERE b_id IS NULL LIMIT 1;
但是,子查询在应用where和limit之前执行完毕,所以结果查询的执行时间是不可接受的。我想知道,有没有一种更聪明的方法不用子查询就可以做到这一点。
p、 这部分地解决了滥用事实,即~90%的子查询实际上在b中没有匹配项,所以我首先运行这个查询:
SELECT * FROM (SELECT A.id, B.id as b_id FROM A LEFT JOIN B ON B.a_id = A.id ORDER BY RAND() LIMIT 10) tmp WHERE b_id IS NULL LIMIT 1;
只有在没有命中率的情况下,我才运行第一个。它起作用了,但看起来很糟糕。
1条答案
按热度按时间gfttwv5a1#
在大数据集中,您可以使用的存在: