tableA
当且仅当rowA_x
没有FK
指向rowB_x
in时,我想获取行数tableB
。
表A:
id | id_tableB
表B
id | ...
所以基本上只有在列不存在tableA
的情况下才应该计算其中的行。id_tableA
id
tableB
有没有一种干净的方法来做这样的计数。我有大约 500.000 行。
有几个(不是 100% 确定 MySQL 语法,所以这可能需要一些调整):
使用 NOT IN 进行子选择:
select count(*) from tableA where id_tableB not in (select id from tableB);
不存在的子选择:
select * from tableA a
where NOT EXISTS (select null from tableB b where a.id_tableB = b.id);
外连接:
select count(*) from (
select a.*, b.id as b_id
from tableA a
left join tableB b on a.id_tableB = b.id)
where b_id IS NULL;
其中哪个最快取决于您的数据,但通常,JOIN 比子查询更有效。
我能想到的最有效的方法是使用子查询:
SELECT COUNT(*)
FROM tableA
WHERE id_tableB NOT IN (
SELECT id
FROM tableB
)
;
编辑: 但是,经过进一步考虑,下面的查询实际上可能更有效,因为它使用 aLEFT OUTER JOIN
而不是子查询。
SELECT COUNT(*)
FROM tableA A
LEFT OUTER JOIN tableB B
ON A.id_tableB= B.id
WHERE B.id IS NULL
;
也许你可以使用WHERE NOT EXISTS()
结构。
如果我很好地理解了您的问题,您的最终查询将如下所示:
SELECT COUNT(*)
FROM tableA
WHERE NOT EXISTS (SELECT id FROM tableB WHERE tableA.id = tableB.id_tableA)