我正在努力让所有课程只有“模块= 5”,任何不同的课程。如下所示,我有4门课程,例如课程2,3,4,5。但是其中只有两门课程只有“模块= 5”,例如课程2,5。
+----+--------+--------+
| id | course | module |
+----+--------+--------+
| 1 | 2 | 5 |
| 2 | 3 | 5 |
| 3 | 3 | 11 |
| 4 | 4 | 5 |
| 5 | 4 | 3 |
| 6 | 5 | 5 |
| 7 | 4 | 6 |
| 8 | 4 | 5 |
+----+--------+--------+
我尝试过做两个查询,在第一个我返回所有有module = 5的课程,在第二个我返回所有有模块的课程!= 5,然后我保存在2个文件中并执行unix命令diff看看两个文件之间的区别。
将所有包含module = 5的课程保存在文件中:
SELECT DISTINCT fullname
FROM mdl_course
LEFT JOIN mdl_course_modules
ON mdl_course.id=mdl_course_modules.course
WHERE mdl_course_modules.module=5
into outfile '/tmp/forum';
将所有包含模块的课程保存在文件中!= 5:
SELECT DISTINCT fullname
FROM mdl_course
LEFT JOIN mdl_course_modules
ON mdl_course.id=mdl_course_modules.course
WHERE mdl_course_modules.module!=5
into outfile '/tmp/plus_forum';
然后,执行差异:
$ diff forum plus_forum
但我想在一个查询中返回所有只有module = 5的课程。有可能吗?
答案 0 :(得分:1)
为简单起见,我们只需解决mdl_course_modules
SELECT course
FROM mdl_course_modules
GROUP BY course
HAVING SUM(module <> 5) = 0
AND SUM(module = 5) = 1 -- or >= 1
答案 1 :(得分:0)
执行此操作的一种方法是将exists谓词与相关子查询一起使用。
select *
from mdl_course_modules t
where not exists (
select 1
from mdl_course_modules
where t.course = course -- reference the outer table
and module <> 5 -- and find rows that have any other module than 5
)
由于尚未完全清楚哪些数据在哪个表格中,您必须调整表格和列名称以适合您的设置,但概念应该是明确的。
答案 2 :(得分:0)
您可以使用not in
子查询执行此操作:
SELECT DISTINCT fullname
FROM mdl_course
LEFT JOIN mdl_course_modules
ON mdl_course.id=mdl_course_modules.course
WHERE mdl_course_modules.module=5
AND course.id not in (SELECT course
FROM mdl_course_modules
WHERE module <> 5)