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

请求拆解两次查询替代数据库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表一次查询完成的「获取当前用户粉丝完整信息」操作,拆分成两个独立的查询:

  1. 先从关联表中提取目标用户ID列表
  2. 再用ID列表去用户表查询详细数据
    以此方式避免使用数据库Join操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:52:48