类Twitter分布式系统MySQL查询:获取指定用户的关注者名称
你的SQL语句问题分析与正确实现方案
首先得指出,你当前的SQL语句没法得到想要的结果——它只会返回你指定的那个用户自己的名字,而不是他的所有关注者的名字,问题出在关联逻辑上:
你的Follower表结构里,id应该是被关注者的ID(也就是你要查询的<some_id>),而followerId才是真正的关注者ID。但你用INNER JOIN User USING(id)的时候,是把Follower.id和User.id做关联,这相当于把被关注者的ID和用户表ID匹配,自然只能拿到被关注者自己的名字。
正确的SQL实现
这里提供两种清晰的写法,都能准确获取指定ID用户的所有关注者名称:
写法一:使用JOIN ... ON(推荐,语义最清晰)
SELECT u.name FROM Follower f INNER JOIN User u ON f.followerId = u.id WHERE f.id = <some_id>;
写法二:使用子查询(适合逻辑简单的场景)
SELECT name FROM User WHERE id IN ( SELECT followerId FROM Follower WHERE id = <some_id> );
额外优化建议
- 给
Follower表的字段重命名:把id改成followed_id(被关注者ID),这样字段语义更明确,后续维护和写SQL时不容易搞混关联关系 - 添加索引:给
Follower表创建联合索引(id, followerId),这样查询时数据库可以直接通过索引定位数据,大幅提升查询效率 - 如果需要处理「关注者已被删除但记录仍留在Follower表」的情况,可以把
INNER JOIN改成LEFT JOIN,不过这种场景下你可能会得到NULL的name值,需要根据业务需求处理
内容的提问来源于stack exchange,提问作者K. Shores
相关产品推荐
相关产品推荐

