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

PHP+MySQL如何编写SQL查询用户通知的已读/未读状态

完善后的通知查询方案

核心SQL语句

SELECT 
    n.ID,
    n.Body,
    n.Date,
    CASE WHEN w.UserID IS NOT NULL THEN 1 ELSE 0 END AS is_read
FROM Notifications n
LEFT JOIN IsWatchedNotifications w 
    ON n.ID = w.NotificationsID 
    AND w.UserID = :user_id;

关键细节说明

  • 必须把用户ID过滤条件放在ON子句中,如果放在WHERE里会将未读通知(无对应关联记录)过滤掉,导致LEFT JOIN失去作用
  • 通过CASE表达式生成is_read字段,直观区分已读(1)和未读(0)状态
  • 使用表别名n和w简化语句结构,提升可读性

PHP代码实现示例(PDO版)

// 假设已完成PDO数据库连接初始化
$currentUserId = 123; // 替换为当前登录用户的实际ID

try {
    $query = "SELECT 
                n.ID,
                n.Body,
                n.Date,
                CASE WHEN w.UserID IS NOT NULL THEN 1 ELSE 0 END AS is_read
            FROM Notifications n
            LEFT JOIN IsWatchedNotifications w 
                ON n.ID = w.NotificationsID 
                AND w.UserID = :user_id";
    
    $stmt = $pdo->prepare($query);
    $stmt->bindParam(':user_id', $currentUserId, PDO::PARAM_INT);
    $stmt->execute();
    
    // 获取所有通知数据,包含已读状态
    $notifications = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // 返回JSON格式数据给Flutter应用
    header('Content-Type: application/json');
    echo json_encode($notifications);
} catch(PDOException $e) {
    // 异常处理
    echo json_encode(['error' => $e->getMessage()]);
}

内容的提问来源于stack exchange,提问作者M Al

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:25:38