请求拆解两次查询替代数据库Join的示例代码逻辑
替代数据库Join的两次查询逻辑拆解
Tumblr开发者Marco Arment提出可以通过两次查询来替代数据库的Join操作,对应的代码如下:
$user_ids = $following->query_return_column_array( 'SELECT user_id FROM ?table WHERE following_id = ?i', $this->id ); $followed_users = $user->find( 'SELECT * FROM ?table WHERE id IN ?ai', $user_ids );
以下是对这段代码核心逻辑的详细拆解:
涉及的两张核心数据表
following:这是一个双列关联表,包含user_id(关注者的ID)和following_id(被关注者的ID)两个字段,专门用来记录社交平台中「谁关注了谁」的关系。user:存储平台所有用户的完整详细信息,比如用户名、头像、个人简介等用户基础数据。
第一段代码逻辑
这段代码的作用是获取当前用户的所有粉丝ID列表:
$following->query_return_column_array(...):调用封装好的数据库方法,执行SQL查询并返回单列数据的数组。- SQL语句
SELECT user_id FROM ?table WHERE following_id = ?i:?table会被框架自动替换为following表,?i会被替换为当前用户的ID($this->id)。最终执行的逻辑是:从following表中找出所有following_id等于当前用户ID的user_id——也就是所有关注了当前用户的人的ID,这些ID会被整理成数组user_ids。
第二段代码逻辑
这段代码的作用是根据粉丝ID获取对应用户的完整信息:
$user->find(...):调用用户表的查询方法,执行SQL并返回用户数据集合。- SQL语句
SELECT * FROM ?table WHERE id IN ?ai:?table会被替换为user表,?ai会被替换为之前得到的user_ids数组。最终执行的逻辑是:从user表中查询所有ID在user_ids数组里的用户的全部字段数据,也就是当前用户所有粉丝的完整信息。 - 注意:变量名
followed_users命名有歧义,更准确的命名应该是followers_full_details(粉丝完整信息)或者following_users(关注我的用户)。
核心思路总结
把原本需要用JOIN关联following和user表一次查询完成的「获取当前用户粉丝完整信息」操作,拆分成两个独立的查询:
- 先从关联表中提取目标用户ID列表
- 再用ID列表去用户表查询详细数据
以此方式避免使用数据库Join操作。
内容的提问来源于stack exchange,提问作者thanks_in_advance
相关产品推荐
相关产品推荐

