1

tableA当且仅当rowA_x没有FK指向rowB_xin时,我想获取行数tableB

表A:

id | id_tableB

表B

id | ...

所以基本上只有在列不存在tableA的情况下才应该计算其中的行。id_tableAidtableB

有没有一种干净的方法来做这样的计数。我有大约 500.000 行。

4

3 回答 3

1

有几个(不是 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 比子查询更有效。

于 2012-10-05T10:03:44.550 回答
0

我能想到的最有效的方法是使用子查询:

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
;
于 2012-10-05T09:51:04.723 回答
0

也许你可以使用WHERE NOT EXISTS()结构。

如果我很好地理解了您的问题,您的最终查询将如下所示:

SELECT COUNT(*)
FROM tableA
WHERE NOT EXISTS (SELECT id FROM tableB WHERE tableA.id = tableB.id_tableA)
于 2012-10-05T09:53:19.617 回答