如何从具有多个约束的INNER JOIN表中进行选择?

时间:2017-10-06 01:35:20

标签: mysql sql

找到在本科和研究生阶段教授的讲师的姓名。

SELECT DISTINCT(CONCAT(firstname, ' ', lastname)) as Lecturer_Name  
FROM Lecturer INNER JOIN Subject on Lecturer.id = Subject.lecturer  
WHERE yearlevel IN(1, 2, 3) and WHERE yearlevel = 9  
GROUP BY Lecturer.id

这不会从2个表 Lecturer Subject 中返回任何内容,其中undergrad中的yearlevel =(1,2,3)和yearlevel = 9是postgrad。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

您在SQL查询中不能有多个WHERE语句。你需要删除第二个。而DISTINCT不是一个功能;你需要一个空格而不是括号来使用它。

另请注意,9不在1, 2, 3,因此WHERE yearlevel IN(1, 2, 3) AND yearlevel = 9不会产生任何结果。您还希望使用 OR 语句。或者更好的是,只需将其包含在IN

SELECT DISTINCT CONCAT(firstname, ' ', lastname) as Lecturer_Name  
FROM Lecturer INNER JOIN Subject on Lecturer.id = Subject.lecturer  
WHERE yearlevel IN(1, 2, 3, 9)  
GROUP BY Lecturer.id

希望这有帮助! :)

答案 1 :(得分:0)

有一点需要注意的是,在AND之后你不需要那个WHERE。 除此之外,您的情况似乎不正确:

yearlevel IN (1, 2, 3) AND yearlevel = 9  

如果年级必须是1,2或3(根据第一个条件),它将不是9.如果年级必须是9(根据第二个条件),它将不是1,2或者3.所以你永远不能同时满足这两个条件,因此永远不会。解决此问题的一种方法是在第一个条件中包含所有内容并删除第二个条件:

yearlevel IN (1, 2, 3, 9)

答案 2 :(得分:0)

DISTINCT不是一个功能。此外,您几乎不需要SELECT DISTINCT GROUP BY

我建议:

SELECT DISTINCT CONCAT_WS(' ', l.firstname, l.lastname) as Lecturer_Name  
FROM Lecturer l INNER JOIN
     Subject s
     ON l.id = s.lecturer  
WHERE yearlevel IN (1, 2, 3) AND yearlevel = 9  ;

请注意,我还添加了表别名。

编辑:

实际上,当我阅读查询时,我认为你打算:

SELECT DISTINCT CONCAT_WS(' ', l.firstname, l.lastname) as Lecturer_Name  
FROM Lecturer l INNER JOIN
     Subject s
     ON l.id = s.lecturer  
GROUP BY CONCAT_WS(' ', l.firstname, l.lastname)
HAVING SUM(yearlevel IN (1, 2, 3)) > 0 AND
       SUM(yearlevel = 9) > 0  ;