多表关联查询问题:筛选指定组用户并标记活动报名状态
问题说明
现有三张数据库表:
- 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
相关产品推荐
相关产品推荐

