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

MySQL与PHP查询问题:筛选特定用户未付费课程

解决方案

方法一:LEFT JOIN 空值筛选法

调整原有关联逻辑,把用户ID匹配条件移到关联规则中,再筛选无支付记录的课程,同时确保返回字段非空:

SELECT 
    course.course_id,
    course.course_name,
    course.image,
    course.amount,
    programme.prog_name
FROM course
INNER JOIN programme ON programme.prog_id = course.prog_id
LEFT JOIN payment ON course.course_id = payment.course_id AND payment.user_id = 21
WHERE 
    course.course_id IS NOT NULL 
    AND course.image IS NOT NULL 
    AND course.course_name IS NOT NULL 
    AND programme.prog_name IS NOT NULL
    AND payment.user_id IS NULL;

核心调整说明:

  • 把payment.user_id = 21从WHERE子句移到LEFT JOIN的ON条件里,这样能保留所有课程,仅关联当前用户的支付记录
  • 通过payment.user_id IS NULL过滤出该用户从未支付过的课程
  • 增加字段非空判断,严格满足返回字段不为空的要求

方法二:NOT EXISTS 子查询法(推荐大数据量场景)

如果课程和支付数据量较大,这种方式性能更优,逻辑也更直观:

SELECT 
    course.course_id,
    course.course_name,
    course.image,
    course.amount,
    programme.prog_name
FROM course
INNER JOIN programme ON programme.prog_id = course.prog_id
WHERE 
    course.course_id IS NOT NULL 
    AND course.image IS NOT NULL 
    AND course.course_name IS NOT NULL 
    AND programme.prog_name IS NOT NULL
    AND NOT EXISTS (
        SELECT 1 
        FROM payment 
        WHERE payment.course_id = course.course_id 
        AND payment.user_id = 21
    );

替换到你的PHP代码

直接将PHP中的$sql变量替换为上面任意一段SQL即可,比如方法一的代码示例:

$sql = "SELECT 
    course.course_id,
    course.course_name,
    course.amount,
    course.image,
    programme.prog_name
FROM course
INNER JOIN programme ON programme.prog_id = course.prog_id
LEFT JOIN payment ON course.course_id = payment.course_id AND payment.user_id = 21
WHERE 
    course.course_id IS NOT NULL 
    AND course.image IS NOT NULL 
    AND course.course_name IS NOT NULL 
    AND programme.prog_name IS NOT NULL
    AND payment.user_id IS NULL;";

内容的提问来源于stack exchange,提问作者Emmanuel Akosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:26