簡體   English   中英

加入后如何獲取一個表的所有行?

[英]How to get all rows of one table after joining?

我有一個包含3個表的數據庫: studentscoursesmistakes 我有一個連接表( 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

+----------+------------+------------+------------+
| 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.

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