2016-05-23 48 views
0

3代表的複雜查詢我有3個表:包括用mysql

  • 學生
  • 實習
  • student_internship


create table student(student_id varchar(45), student_name varchar(45)); 
create table internship(internship_id varchar(45), internship_name varchar(45)); 

和student_intership是「BRIDG e'的兩個表。

student_intership(student_id, internship_id) 

因此,這是一個多方面的情況。

現狀:

我想獲得實習和學生數量的名稱,但 如果沒有學生對於實習,所以它應該有下面的例子:

intership_name | count(student_id) 
-------------------------------- 
1. intern1  | 20 
2. intern2  | 3 
3. intern3  | 0 

的碼我曾嘗試:

select internship.internship_id, count(student.student_id) 
from student_internship, internship, student 
where student_internship.student_id = student.student_id 
and student_internship.internship_id = internship.internship_id 
group by student_internship.internship_id; 
+1

你嘗試過什麼?你可能會在某處需要一個'LEFT JOIN'。 –

+0

@RocketHazmat是的,我試過了,我可以得到第2行...我有第三行的問題,我不能得到0 intern3因爲沒有與intern3相關的學生 – Wilz5363

+1

你能告訴我們你試過什麼嗎? –

回答

2

試試這個:

SELECT i.internship_name, COALESCE(COUNT(si.student_id), 0) AS cnt 
FROM internship i 
LEFT JOIN student_intership si ON i.internship_id = si.internship_id 
GROUP BY si.internship_id, i.internship_name 

以上查詢將返回全部internship的記錄。它將返回0internship記錄與student記錄無關。

+1

爲什麼你需要用'i.internship_name'進行分組? 「GROUP BY si.internship_id」是否足夠? –

+1

@RocketHazmat在最新版本的MySQL(5.7.5)中,查詢的'SELECT'子句中存在的所有非聚合列必須出現在GROUP BY子句中(請參見[here](https:// dev .mysql.com/DOC/refman/5.7/EN/SQL-mode.html#sqlmode_only_full_group_by))。 –

+0

@GiorgosBetsos爲什麼查詢中不需要學生表?我的意思是,如何知道查詢中是否需要表格?因爲我有其他複雜的查詢涉及6桌,我想了解它...你能教我嗎? – Wilz5363

0

快速刺:

SELECT st.student_id 
    ,st.student_name 
    ,si.InternshipCount 
FROM student st 
LEFT JOIN (
    SELECT count(*) AS InternshipCount 
     ,student_id 
    FROM student_internship s 
    INNER JOIN internship i 
     ON s.student_id = i.student_id 
     group by student_id 
    ) AS si 
    ON st.student_id = si.student_id