如何编写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
相关产品推荐
相关产品推荐

