簡體   English   中英

MYSQL連接三個表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM