Mysql 如何选择所有从彼得森至少上过两门课但从大卫那里只上过一门课的学生?

Mysql 如何选择所有从彼得森至少上过两门课但从大卫那里只上过一门课的学生?,mysql,xampp,Mysql,Xampp,嗨,我在上MySQL课程,我被一个问题困住了,这是我的桌子 Student(S_ID, S_FIRST_NAME, S_LAST_NAME, S_MAJOR) Course(C_ID, C_NAME, C_INST_NAME, C_ROOM) takes(S_ID,C_ID) 我的问题是,如何找到所有至少选修两门课程的学生的名字 彼得森教授的课程,但戴维森只教授一门课程 SELECT s.S_FIRST_NAME, s.S_LAST_NAME FROM Student s

嗨,我在上MySQL课程,我被一个问题困住了,这是我的桌子

 Student(S_ID, S_FIRST_NAME, S_LAST_NAME, S_MAJOR)

 Course(C_ID, C_NAME, C_INST_NAME, C_ROOM)
 takes(S_ID,C_ID)
我的问题是,如何找到所有至少选修两门课程的学生的名字 彼得森教授的课程,但戴维森只教授一门课程

SELECT s.S_FIRST_NAME,
       s.S_LAST_NAME
FROM Student s
INNER JOIN
(
    SELECT t.S_ID
    FROM takes t
    INNER JOIN Course c
        ON t.C_ID = c.C_ID
    GROUP BY t.S_ID
    HAVING SUM(CASE WHEN c.C_INST_NAME = 'Peterson' THEN 1 ELSE 0 END) >= 2 AND
           SUM(CASE WHEN c.C_INST_NAME = 'Davidson' THEN 1 ELSE 0 END) <= 1
) t
    ON s.S_ID = t.S_ID
我能够得到一个学生的成绩,他至少选修了2门课程 Peterson提出以下问题:

 select student.S_FIRST_NAME from student  inner join
 student_course on student_course.S_ID = student.S_ID 
 -> inner join course on course.C_ID = student_course.C_ID 
 -> where course.C_INST_NAME = 'Peterson' 
 -> group by student.S_FIRST_NAME
 -> having count(distinct course.C_ID)>=2;

 +--------------+
 | S_FIRST_NAME |
 +--------------+
 | Eden         |
 | Kery         |
 | Micheal      |
 | Yeison       |
 +--------------+
我尝试了以下查询以满足这两个要求:

  select student.S_FIRST_NAME from student  inner join student_course on 
  student_course.S_ID = student.S_ID inner join course on course.C_ID =
  student_course.C_ID  where course.C_INST_NAME = 'Peterson'  group by 
  student.S_FIRST_NAME having count(distinct course.C_ID)>=2 and 
  student.S_FIRST_NAME from student inner join student_course on 
  student_course.S_ID = student.S_ID  inner join course on course.C_ID = 
  student_course.C_ID where course.C_INST_NAME = 'Davidson' group by 
  student.S_FIRST_NAME having count(distinct course.C_ID)=1;
但“不工作”得到了以下错误:

 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual 
 that corresponds to your MariaDB server version for the right syntax to use 
 near 'from student
 inner join student_course on student_course.S_ID = student.S_ID 
 in' at line 1
 I went back and look at the code again but couldn't figure it out what the 
 problem is, and inner join is the complicated one i think it is just for me. 
 any help would be appreciated please !! thank you in advance.

这个答案的基本策略是按学生汇总课程表,只保留那些在彼得森至少有两门课程,在戴维森最多有一门课程的学生

SELECT s.S_FIRST_NAME,
       s.S_LAST_NAME
FROM Student s
INNER JOIN
(
    SELECT t.S_ID
    FROM takes t
    INNER JOIN Course c
        ON t.C_ID = c.C_ID
    GROUP BY t.S_ID
    HAVING SUM(CASE WHEN c.C_INST_NAME = 'Peterson' THEN 1 ELSE 0 END) >= 2 AND
           SUM(CASE WHEN c.C_INST_NAME = 'Davidson' THEN 1 ELSE 0 END) <= 1
) t
    ON s.S_ID = t.S_ID

很抱歉打扰您,但是这个错误意味着什么,我没有发现任何错误,但是得到了这个错误:错误1064 42000:您的SQL语法有一个错误;检查与您的MariaDB服务器版本相对应的手册,以了解在“HAVING SUMCASE WHEN c.c_INST_NAME='Davidson'然后1 ELSE 0 END@anonymous抱歉,我错误地包含了HAVING关键字两次”附近使用的正确语法。删除第二个,就像我在更新的查询中所做的那样。@匿名如果这个答案有用,请向上投票。如果它回答了你的问题,就接受它。这就是这个网站的工作原理。所以,如果我想选择所有从戴维森学习所有课程的学生,只需修改你的代码从学生的内部连接选择s.s_ID从takes t内部连接选择t.s_ID在t.c_ID=c.c_ID组中选择t.s_ID,当c.c_INST_NAME='Davidson'时,则1其他0 end=3 t在s.s_ID=t.s_ID;因为我已经知道戴维森在这个案例3中教了多少课,如果我不知道他在教什么课,我该如何写查询谢谢!你应该提出一个新问题,你在问一些不同的问题。