如何调整变量以使其获取IN子句中的所有值

时间:2017-11-15 21:35:55

标签: mysql

我很犹豫,我没有得到解决方案,所以我转过来。 快速解释一下,假设我想按如下方式过滤查询:

SELECT name FROM students WHERE courseCode IN (17, 18, 19);

在这里,我将了解注册17 18 19的课程的学生。

现在,您如何获得参加这3门课程的学生?也就是说,在17 18 19?

当你知道“courseCode”值是什么时,它可能很简单,但是当你用子查询得到这些值时你会怎么做呢?

这样的事情:

SELECT name FROM students WHERE courseCode = 17 and courseCode = 18 and courseCode = 19;

当我知道值(这不正确)时

但是当我不知道它们是什么价值时我该怎么办?像这样:

SELECT name FROM students WHERE courseCode IN (SELECT courseCode FROM course WHERE ...);

我希望你能很好地解释我,谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

这是一种可行的方法,使用GROUP BY进行折叠并获取不同的课程代码,并将其与文字进行比较:

 SELECT s.name
   FROM students s 
  WHERE s.courseCode IN (17,18,19)
  GROUP BY s.name
 HAVING COUNT(DISTINCT s.courseCode) = 3 

(17,18,19)可以用子查询替换。但我倾向于使用内联视图和连接操作。

 SELECT s.name
   FROM students s
   JOIN ( SELECT 17 AS courseCode
           UNION ALL SELECT 18
           UNION ALL SELECT 19
        ) c
     ON c.courseCode = s.courseCode
  GROUP BY s.name
 HAVING COUNT(DISTINCT s.courseCode) = 3

内联视图c的查询只需返回具有适当数据类型的名为courseCode的列的不同值...很多可能的查询都可以...

   JOIN ( SELECT foo AS courseCode 
            FROM bar 
           WHERE ... 
           GROUP BY foo
        ) c

这是一种方法的例子,还有其他方法......