通过限定多个字符串来选择SQL

时间:2017-09-22 21:06:47

标签: mysql sql

我必须找到在课程和其他课程中注册的学生姓名。但是,当我执行WHERE语句时,它会删除所有其他具有其他类的行。

所以我的问题是:我该怎样做才能比较整个小组,只选择CLASSA和CLASSB的学生。

有些学生在CLASSA学习,有些学生在CLASSB学习,有些学生在CLASSB学习。如何获得两者中的那个?

例如:

  • John Smith在CLASSA
  • BETTY WHITE在CLASSB
  • Timmy Edwards在CLASSA
  • Timmy Edwards在CLASSB

如果我使用OR,它将选择所有名称。但我只想要一个同时上课的学生。所以Timmy Edwards是我想要的人。

WHERE C.DESCRIPTION LIKE 'Systems Analysis%'

AND C.DESCRIPTION LIKE'项目管理%'

4 个答案:

答案 0 :(得分:1)

您可以使用group byhaving

select student
from enrollments
where class in ('CLASSA', 'CLASSB')
group by student
having count(*) = 2;

此版本假定学生只能为特定课程注册一次。

答案 1 :(得分:0)

每个类都没有单独的行。这意味着,ANDOR在您使用它们时毫无用处。您需要使用EXISTS关键字检查是否存在此类行。

select distinct
  student
from
  enrollments
where
  exists (
    select 
      1 
    from 
      enrollments e1
    where
      e1.student   = enrollments.student
      and e1.class = 'CLASSA'
  ) and exists (
    select 
      1 
    from 
      enrollments e2
    where
      e2.student   = enrollments.student
      and e2.class = 'CLASSB'
  )

注意:
每行都会包含学生姓名,因此我添加了DISTINCT关键字以删除重复项。

答案 2 :(得分:0)

你可以尝试这样的事情,(虽然我不确定你的架构究竟是什么样的......)

    WITH a AS
    (
        SELECT 
        S.FIRST_NAME||' '||S.LAST_NAME [Student]
        ,C.DESCRIPTION 
        FROM STUDENT S 
        JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
        JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
        JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)

        WHERE C.DESCRIPTION  = 'CourseA'
    )
    ,b AS
    (
        SELECT 
        S.FIRST_NAME||' '||S.LAST_NAME [Student]
        ,C.DESCRIPTION 
        FROM STUDENT S 
        JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
        JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
        JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)

        WHERE C.DESCRIPTION  = 'CourseB'
    )

    Select a.Student, a.Description [DescA], b.Description [DescB]
    from a join b on a.Student = b.Student

    --optional where to just get students in both classes...
    where a.Description is not null and b.Description is not null

希望这有助于......

答案 3 :(得分:0)

您总是可以尝试将SELECT结果与自身结合然后从该结果中选择的巧妙技巧。

SELECT A.NAME
FROM (SELECT S.FIRST_NAME||' '||S.LAST_NAME as NAME, 
             S.STUDENT_ID as S_ID,
             C.DESCRIPTION as DESC
        FROM STUDENT S 
        JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
        JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
        JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)) A

JOIN (S.STUDENT_ID as S_ID, C.DESCRIPTION as DESC
        FROM STUDENT S 
        JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID) 
        JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID) 
        JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)) B   

ON A.S_ID = B.S_ID
WHERE A.DESC LIKE 'Systems Analysis%'
  AND B.DESC LIKE 'Project Management%'
GROUP BY A.NAME