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

多表关联查询问题:筛选指定组用户并标记活动报名状态

问题说明

现有三张数据库表:

  • Characters表:存储用户CharID与FirstName
  • Group表:存储GroupID与用户CharID的关联关系
  • Events表:存储EventID与报名用户CharID的关联关系

需求:查询GroupID=15的所有用户的CharID、FirstName,并新增EventSignedUp字段——若用户报名了EventID=22则该字段值为1,否则为0。

现有SQL语句执行后仅返回报名了EventID=22的用户,无法得到未报名用户的0值,不符合预期:

$stmt = $db->prepare("SELECT    c.ID            AS cID,
                                c.Firstname     AS cFirstname,
                                e.EventID       AS eEventSignedUp
                            FROM Group g
                            JOIN Characters c   ON c.CharID = g.CharID
                            JOIN Events e       ON e.CharID = g.CharID AND EventID='22'
                            WHERE GroupID='15'");

预期结果示例:

CharID  Firstname   EventSignedUp           
1       Frank       0           
3       Bart        1           
5       Monica      0           
6       Ralf        1           
修正方案

问题出在使用了内连接(JOIN),内连接只会返回两张表中匹配关联条件的记录,未报名的用户在Events表中没有对应记录,所以会被过滤掉。需要改用**左连接(LEFT JOIN)**保留GroupID=15的所有用户,再通过条件判断生成EventSignedUp字段。

修正后的SQL语句:

$stmt = $db->prepare("SELECT 
    c.CharID AS CharID,
    c.Firstname AS Firstname,
    CASE WHEN e.EventID IS NOT NULL THEN 1 ELSE 0 END AS EventSignedUp
FROM `Group` g
JOIN Characters c ON c.CharID = g.CharID
LEFT JOIN Events e ON e.CharID = g.CharID AND e.EventID = '22'
WHERE g.GroupID = '15'");
关键改动说明
  • 将Events表的内连接改为LEFT JOIN:确保GroupID=15的所有用户都被保留,即使他们没有报名EventID=22
  • 使用CASE语句生成EventSignedUp字段:判断左连接后e.EventID是否不为空,不为空则说明已报名,赋值1,否则赋值0
  • 注意Group是SQL关键字,需要用反引号`包裹避免语法错误
  • 修正字段映射:原SQL中用c.ID,但Characters表存储的是CharID,调整为c.CharID匹配表结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:45:56