[英]How to get all rows of one table after joining?
我有一個包含3個表的數據庫: students
, courses
和mistakes
。 我有一個連接表( csm
),我在其中連接3個表。 我想每個課程的錯誤都是一樣的。
+----------+---------------+
| crs_id | crs_name |
+----------+---------------+
| 1 | HTML |
| 2 | PHP |
| 3 | Python |
+----------+---------------+
+----------+---------------+---------------+
| stu_id | stu_firstname | stu_lastname |
+----------+---------------+---------------+
| 1 | Tina | Turner |
| 2 | Lisa | Laroi |
| 3 | Dina | Donna |
| 3 | Jim | Leduc |
+----------+---------------+---------------+
+----------+---------------+------------+
| mis_id | mis_name | mis_weight |
+----------+---------------+------------+
| 1 | No camelCase | 7 |
| 2 | No brackets | 10 |
| 3 | Operator mist.| 12 |
+----------+---------------+------------+
+----------+------------+------------+------------+
| csm_id | fk_crs_id | fk_stu_id | fk_mis_id |
+----------+------------+------------+------------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 3 |
| 3 | 2 | 3 | 1 |
| 4 | 3 | 2 | 2 |
| 5 | 3 | 2 | 1 |
| 6 | 3 | 3 | 1 |
+----------+------------+------------+------------+
如果我選擇一門特定的課程,則希望獲得該課程的所有學生及其減分的列表。 因此,我也想讓加入表csm中沒有結果的學生。
我得到的最接近的結果是以下SQL語句:
select stu_firsname, stu_lastname, csm.*, sum(mis_weight)
from students s
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id
left join mistakes m on csm.fk_mis_id = m.mis_id
where fk_crs_id = 4 or fk_crs_id is null
group by stu_firstname;
這樣,我就可以得出某門課程的錯誤總和,以及在CSM表中沒有任何記錄但缺少一些結果的學生。 例如,這不會顯示在CSM表中有記錄的學生,但不會顯示所請求課程的學生。
如何在成績表中找到這些學生?
如果您的主要數據在CSM表中,請嘗試以下操作:
select s.stu_firsname, s.stu_lastname, csm.*, sum(m.mis_weight) from crs_stu_mis csm
join students s on s.stu_id = csm.fk_stu_id
join mistakes m on csm.fk_mis_id = m.fou_id
csm.fk_crs_id = 4
group by s.stu_naam;
第二種情況:您的數據會受到group by屬性的影響,請嘗試將其不是NULL的try屬性,例如:
select s.stu_firsname, s.stu_lastname, csm.*, sum(m.mis_weight) from crs_stu_mis csm
join students s on s.stu_id = csm.fk_stu_id
join mistakes m on csm.fk_mis_id = m.fou_id
csm.fk_crs_id = 4
group by csm.csm_id;
在您的查詢中:
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id`
...
where fk_crs_id = 4 or fk_crs_id is null
這並不是您想要的,因為這種情況將過濾出在csm
表中僅記錄了4
以外課程的學生。 您想要將該條件移至相應的LEFT JOIN
:
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id AND csm.fk_crs_id = 4
問題的另一個潛在來源是查詢處理聚合的方式。 SELECT
子句中有未聚合的列,它們沒有出現在GROUP BY
子句中。 此語法不是良好的SQL編碼實踐,並且自MySQL 5.7版以來不再受支持。 我假設您要為每個學生的成績記錄一個。
查詢:
select
s.stu_firstname,
s.stu_lastname,
sum(m.mis_weight) total_misses_weight
from
students s
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id AND csm.fk_crs_id = 3
left join mistakes m on csm.fk_mis_id = m.mis_id
group by
s.stu_id,
s.stu_firstname,
s.stu_lastname
關於DB Fiddle的課程ID 3
演示 :
| stu_firstname | stu_lastname | total_misses_weight |
| ------------- | ------------ | ------------------- |
| Tina | Turner | |
| Lisa | Laroi | 17 |
| Dina | Donna | 7 |
| Jim | Leduc | |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.