基于get name from id场景传入mem_id查询收藏食谱信息的SQL编写咨询
关联查询实现:按用户ID获取全部收藏食谱详情
本次需求的核心关联桥梁是tbl_fav收藏表,表内同时存储用户主键mem_id和食谱主键rec_id的外键关联,无需回查用户表即可完成核心查询逻辑。
基础可用版本(适配现有表结构)
-- 将实际的mem_id参数替换到WHERE条件位置即可执行 SELECT r.* FROM tbl_fav f INNER JOIN tbl_recipe r ON f.rec_id = r.rec_id WHERE f.mem_id = /* 传入的目标用户mem_id */;
该版本执行效果:
- 匹配当前传入用户ID下的所有食谱收藏关联记录,返回食谱表全部核心字段,覆盖食谱名称、预处理时长、烹饪时长、食谱描述等要求的信息
- 通过
INNER JOIN天然过滤无效条目:如果收藏记录对应的食谱已经被物理删除,不会返回空的无效结果行
可选增强版本
如果需要校验传入的mem_id为数据库中真实存在的有效用户,降低无效参数的排查成本,可以补充关联用户表做存在性校验,查询写法调整为:
SELECT r.*, f.fav_id AS fav_record_id FROM tbl_member m INNER JOIN tbl_fav f ON m.mem_id = f.mem_id INNER JOIN tbl_recipe r ON f.rec_id = r.rec_id WHERE m.mem_id = /* 传入的目标用户mem_id */;
该版本的附加能力:同时返回用户每条收藏记录的主键ID,后续做取消收藏操作时可以直接定位对应条目,不需要再二次查询收藏记录ID。
实操注意点
- 不要跳过收藏表直接关联用户表和食谱表:两张表没有直接的外键映射,硬写关联条件会生成笛卡尔积,返回的结果会完全错乱
- 如果收藏表存在历史脏数据(比如同一用户重复收藏同一条食谱),可以在SELECT 后面加
DISTINCT做结果去重,避免前端接收到重复的食谱条目 - 后续如果食谱表加了软删除标记,记得在WHERE条件里加对应过滤,不要把已经下架的食谱返回给用户
内容的提问来源于stack exchange,提问作者Mehul Panchal
相关产品推荐
相关产品推荐

