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

如何编写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;

语句说明

  1. CASE条件判断:核心逻辑是根据donated_info表的status字段值,决定返回接受者信息还是空字符串,完全符合你"状态为accepted时显示接受者姓名电话,to_accept时为空"的要求。
  2. LEFT JOIN关联:使用左连接而不是内连接,是为了保证那些还没被接受(status='to_accept')的捐赠记录也能被查询出来,此时accepted_info和user_info中没有匹配的数据,对应的name和phone会被CASE语句设为空。
  3. 捐赠者过滤:最后的WHERE条件用来限定只查询当前登录捐赠者的记录,:donor_user_id需要替换成你程序中当前用户的实际user_id值(比如从会话中获取的变量)。

额外注意点

如果你的业务场景中存在一个食品被多次接受的极端情况(理论上应该不会),可以在语句末尾加上GROUP BY di.Food_id来避免重复返回同一条捐赠记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:07:38