sql - 如何获得模块= 5的课程

时间:2016-06-17 14:49:53

标签: mysql sql

我正在努力让所有课程只有“模块= 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看看两个文件之间的区别。

  1. 将所有包含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';
    
  2. 将所有包含模块的课程保存在文件中!= 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';
    
  3. 然后,执行差异:

    $ diff forum plus_forum
    
  4. 但我想在一个查询中返回所有只有module = 5的课程。有可能吗?

3 个答案:

答案 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
)  

Sample SQL Fiddle

由于尚未完全清楚哪些数据在哪个表格中,您必须调整表格和列名称以适合您的设置,但概念应该是明确的。

答案 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)