mysql

a9wyjsp7  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(216)

等级表

+----+-------+--------------+
| id |teac_id| student_id   |
+----+-------+--------------+
| 1  | 1     | 1,2,3,4      |
+----+-------+--------------+

学生成绩

+----+----------+--------+
| id |student_id| marks  |
+----+----------+--------+
| 1  | 1        | 12     |
+----+----------+--------+
| 2  | 2        | 80     |
+----+----------+--------+
| 3  | 3        | 20     |
+----+----------+--------+

我有这两个表,我想计算学生的总分,我的sql是:

SELECT SUM(`marks`) 
FROM `student_mark`
WHERE `student_id` IN 
  (SELECT `student_id` FROM `class_table` WHERE `teac_id` = '1')

但这会回来的 null ,请帮忙!!
小提琴

qlfbtfca

qlfbtfca1#

首先,永远不要在列中存储逗号分隔的数据。你真的应该规范你的数据。所以基本上,可以有一个多对多表Map teacher_to_student ,将有 teac_id 以及 student_id 柱。
在这种特殊情况下,您可以利用 Find_in_set() 功能。
从你目前的问题来看,你似乎在试图为一个老师获得总分(他/她的所有学生的总分)。
尝试:

SELECT SUM(sm.`marks`) 
FROM `student_mark` AS sm
JOIN `class_table` AS ct 
  ON FIND_IN_SET(sm.`student_id`, ct.`student_id`) > 0
WHERE ct.`teac_id` = '1'

如果你想得到每个学生的总分,你需要加一个 Group By . 查询如下所示:

SELECT sm.`student_id`, 
       SUM(sm.`marks`) 
FROM `student_mark` AS sm
JOIN `class_table` AS ct 
  ON FIND_IN_SET(sm.`student_id`, ct.`student_id`) > 0
WHERE ct.`teac_id` = '1' 
GROUP BY sm.`student_id`
gmxoilav

gmxoilav2#

如果您想根据以逗号分隔的id列表筛选表,我的方法是在列表的开头和结尾以及id的开头和结尾附加额外的逗号,例如。 1 变成 ,1, 名单就会变成 ,1,2,3,4, . 这样做的原因是为了避免含糊不清的匹配,比如1匹配列表中的21或12。
也, EXISTS 在这种情况下非常适合 INSTR 功能应起作用:

SELECT SUM(`marks`) 
FROM `student_mark` sm
WHERE EXISTS(SELECT 1 FROM `class_table` 
             WHERE `teac_id` = '1' AND
             INSTR(CONCAT(',', student_id, ','), CONCAT(',', sm.student_id, ',')) > 0)

演示
但不应该在一个单元格中以逗号分隔的列表形式存储相关ID—它应该是外键列以形成适当的关系。那么连接就变得微不足道了。

uqdfh47h

uqdfh47h3#

如果您想知道原因,它返回null的原因是因为子查询作为一个整体返回“1,2,3,4”。你需要的是让它分别返回1,2,3,4。
您的查询返回了什么

SELECT SUM(`marks`) 
FROM `student_mark`
WHERE `student_id` IN ('1,2,3,4')

你所期望的是

SELECT SUM(`marks`) 
FROM `student_mark`
WHERE `student_id` IN (1,2,3,4)

最好的办法就是像@madhur说的那样正常化。在你的情况下,你需要使教师和学生作为一对多的联系

+----+-------+--------------+
| id |teac_id| student_id   |
+----+-------+--------------+
| 1  | 1     | 1            |
+----+-------+--------------+
| 2  | 1     | 2            |
+----+-------+--------------+
| 3  | 1     | 3            |
+----+-------+--------------+
| 4  | 1     | 4            |
+----+-------+--------------+

相关问题