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
相关产品推荐
相关产品推荐

