2017-10-06 77 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 ;