如何编写MySQL三表关联查询实现食品捐赠应用的捐赠状态查看功能
实现捐赠者查看捐赠状态的MySQL查询方案
刚好帮你解决这个需求,我们可以通过关联查询+条件判断来实现你要的效果,具体的SQL语句和思路如下:
最终查询语句
SELECT -- 当食品已被接受时,显示接受者的姓名,否则为空 CASE WHEN di.status = 'accepted' THEN ui.name ELSE '' END AS name, -- 同理处理手机号字段 CASE WHEN di.status = 'accepted' THEN ui.phone ELSE '' END AS phone, di.Food_item, di.Image FROM donated_info di -- 左关联接受记录表,确保未被接受的捐赠记录也能被查询到 LEFT JOIN accepted_info ai ON di.Food_id = ai.Food_id -- 左关联接受者的用户信息表,只有当食品被接受时才会匹配到数据 LEFT JOIN user_info ui ON ai.user_id = ui.user_id -- 过滤出当前捐赠者的所有捐赠记录,替换成实际的捐赠者user_id(比如程序中的变量) WHERE di.user_id = :donor_user_id;
语句说明
- CASE条件判断:核心逻辑是根据
donated_info表的status字段值,决定返回接受者信息还是空字符串,完全符合你"状态为accepted时显示接受者姓名电话,to_accept时为空"的要求。 - LEFT JOIN关联:使用左连接而不是内连接,是为了保证那些还没被接受(
status='to_accept')的捐赠记录也能被查询出来,此时accepted_info和user_info中没有匹配的数据,对应的name和phone会被CASE语句设为空。 - 捐赠者过滤:最后的
WHERE条件用来限定只查询当前登录捐赠者的记录,:donor_user_id需要替换成你程序中当前用户的实际user_id值(比如从会话中获取的变量)。
额外注意点
如果你的业务场景中存在一个食品被多次接受的极端情况(理论上应该不会),可以在语句末尾加上GROUP BY di.Food_id来避免重复返回同一条捐赠记录。
内容的提问来源于stack exchange,提问作者Sharon Shelton
相关产品推荐
相关产品推荐

