选择不包含其他表引用的记录

6psbrbz9  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(223)

这个问题在这里已经有答案了

连接中的否定条件(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;

只有在没有命中率的情况下,我才运行第一个。它起作用了,但看起来很糟糕。

gfttwv5a

gfttwv5a1#

在大数据集中,您可以使用的存在:

SELECT *
FROM A
WHERE NOT EXISTS (
SELECT *
FROM B
WHERE A.id = B.a_id
)

相关问题