抱歉,无法正确描述标题中的问题。 比方说,我有两个表 A(id,其他列)和 B(id,a_id,其他列),其中 a_id - A 表的外键。 A 有大约 10 000 条记录,B 大约有 10 000 条记录。我需要从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 之前完全执行,因此生成的查询执行时间 Not Acceptable 。 我想知道是否有一种更智能的方法可以在不使用子查询的情况下执行相同的操作。
附注这部分解决了滥用约 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;
只有当它没有点击时我才会运行第一个。它有效,但看起来很糟糕。
最佳答案
在大数据集中你可以使用存在:
SELECT *
FROM A
WHERE NOT EXISTS (
SELECT *
FROM B
WHERE A.id = B.a_id
)
关于mysql - 选择不包含其他表引用的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50628370/