You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MySQL语句统计无关联actions记录的links数量

统计未关联actions记录的links数量的SQL写法

嘿,这个需求很常见,我给你几种靠谱的SQL实现方式,你可以根据自己的场景选择最合适的:

方法一:LEFT JOIN + IS NULL(最直观的写法)

这种方法通过左连接保留所有links记录,然后筛选出没有对应actions关联的条目:

SELECT COUNT(l.id) AS unlinked_links_count
FROM links l
LEFT JOIN actions a ON l.id = a.link_id
WHERE a.link_id IS NULL;

说明:LEFT JOIN会返回links表的全部行,当某条link没有对应的actions记录时,a.link_id会是NULL,我们通过这个条件筛选出这些无关联的记录,再用COUNT统计数量。

方法二:NOT EXISTS子查询(性能友好的写法)

如果你的数据量较大,这种写法在MySQL中通常有不错的性能,尤其是当actions.link_id有索引时:

SELECT COUNT(id) AS unlinked_links_count
FROM links l
WHERE NOT EXISTS (
    SELECT 1 FROM actions a WHERE a.link_id = l.id
);

说明:NOT EXISTS会逐行检查links中的每个id是否在actions的link_id中存在,不存在的记录会被纳入统计,子查询里用SELECT 1比选具体字段更高效,因为数据库不需要返回实际数据,只需要判断存在性。

方法三:NOT IN(注意避坑)

这种写法要特别注意处理NULL值,否则会得到错误结果:

SELECT COUNT(id) AS unlinked_links_count
FROM links
WHERE id NOT IN (
    SELECT DISTINCT link_id FROM actions WHERE link_id IS NOT NULL
);

说明:如果actions表中存在link_id为NULL的记录,直接用NOT IN会导致整个查询返回空结果(这是SQL的逻辑特性),所以必须在子查询中加上WHERE link_id IS NOT NULL来过滤掉NULL值,同时用DISTINCT减少子查询返回的重复值,提升效率。

小建议

如果你的数据量比较大,建议给actions表的link_id字段添加索引,这样关联查询的速度会明显提升;另外links表的id作为主键,默认已经有索引,不用额外处理。

内容的提问来源于stack exchange,提问作者Leeroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:32:12