[英]MYSQL joining three tables
我有一個簡單的多學校管理系統,我正在嘗試獲取特定學校的教師總數和學生總數。 我的表結構如下:
teachers
--------------------------
id | schoolid | Name | etc...
--------------------------
1 | 1 | Bob |
2 | 1 | Sarah|
3 | 2 | John |
students
--------------------------
id | schoolid | Name | etc...
--------------------------
1 | 1 | Jack |
2 | 1 | David|
3 | 2 | Adam |
schools
--------------------------
id | Name | etc...
---------------------------
1 | River Park High |
2 | Stirling High |
我可以通過以下查詢僅計算所有教師的人數:
SELECT COUNT(a.id) AS `totalteachers`
FROM teachers a
LEFT JOIN schools b ON a.schoolid = b.id WHERE b.id = '1'
同樣,我可以通過以下查詢來計算教師人數:
SELECT COUNT(a.id) AS `totalstudents`
FROM students a
LEFT JOIN schools b ON a.schoolid = b.id WHERE b.id = '1'
但是,我正在努力嘗試將這兩個查詢結合起來以得到如下所示的簡單結果:
totalstudents | totalteachers
--------------------------------
2 | 2
我嘗試了以下方法:
SELECT COUNT(a.id) as `totalteachers`, COUNT(c.id) as `totalstudents`
FROM teachers a
LEFT JOIN schools b ON a.schoolid = b.id
LEFT JOIN students c ON c.schoolid=b.id WHERE b.id = '5'
你可以做這樣的事情
SELECT
id, name, s.total AS totalstudents, t.total AS totalteachers
FROM schools
JOIN (SELECT schoolid, COUNT(id) AS total FROM teachers GROUP BY schoolid)
AS t ON t.schoolid = id
JOIN (SELECT schoolid, COUNT(id) AS total FROM students GROUP BY schoolid)
AS s ON s.schoolid = id
那么您可以添加where id = 2
或任何限制學校的內容。
多個左聯接的問題在於,它會為每位學生的每位老師生成額外的記錄; 人為誇大您的數量
有四種解決方法:(最好的imo是Andrew bone所做的事情)
只需選擇不帶聯接的內聯,這樣就不會增加計數。 (在我看來,這是最理想的,因為它易於維護)
SELECT (SELECT COUNT(a.id) AS `totalteachers`
FROM teachers a
WHERE A.SchoolID = '1') as TotalTeachers
, (SELECT COUNT(a.id) AS `totalstudents`
FROM students a
WHERE a.SchoolID = '1') as TotalStudents
使用子查詢先獲得聯接之前的計數,然后再聯接。 由於count始終為1,因此交叉連接有效。
SELECT totalTeachers, totalStudents
FROM (SELECT COUNT(a.id) AS `totalteachers`
FROM teachers a
LEFT JOIN schools b
ON a.schoolid = b.id
WHERE b.id = '1')
CROSS JOIN (SELECT COUNT(a.id) AS `totalstudents`
FROM students a
LEFT JOIN schools b ON a.schoolid = b.id
WHERE b.id = '1')
在計數中使用與眾不同的關鍵字,以免重復計數並消除人為膨脹(在我看來,這是不可取的,因為這掩蓋了人工計數的增加)
SELECT COUNT(distinct a.id) as `totalteachers`, COUNT(distinct c.id) as `totalstudents`
FROM teachers a
LEFT JOIN schools b ON a.schoolid = b.id
LEFT JOIN students c ON c.schoolid=b.id WHERE b.id = '5'
另一種方法是使用窗口函數,但是這些函數在mySQL中不可用。
SELECT COUNT(t.id) AS TotalTeachers, COUNT(st.id) AS TotalStudents
FROM schools s
INNER JOIN teachers t
ON s.id = t.schoolid
INNER JOIN students st
ON s.id = st.schoolid
試試這個SQL。 我沒有嘗試過,但是應該可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.