2017-10-06 96 views
1

找到在本科和研究生阶段任教的讲师姓名。如何从具有多个约束的INNER JOIN表中选择?

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个表没什么讲师主题,其中在本科和yearlevel = 9 yearlevel =(1,2,3)是个硕士。

任何帮助将不胜感激。

+0

'DISTINCT'是** **没有的功能,它是'选择DISTINCT'的一部分,应用于整个选定的行。为了使事情更清楚,删除那些多余的括号,即'SELECT DISTINCT CONCAT(firstname,',lastname)...'。 – jarlh

回答

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 

希望这有助于! :)

0

有一点要注意的是,你不需要在AND之后的那个地方。 除此之外,你的条件似乎并不正确:

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

如果yearlevel必须是1,2,或3(按第一条件),也不会是9.如果在yearlevel必须是9(根据第二个条件),它不会是1,2或3.因此,您将永远无法同时满足这两个条件,因此永远不会。解决方法之一是包括所有在第一个条件,并删除第二:

yearlevel IN (1, 2, 3, 9) 
0

DISTINCT不是一个函数。此外,你几乎从不需要SELECT DISTINCTGROUP 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 ;