class_table
+----+-------+--------------+
| id |teac_id| student_id |
+----+-------+--------------+
| 1 | 1 | 1,2,3,4 |
+----+-------+--------------+
student_mark
+----+----------+--------+
| 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
,请帮忙!!
数据库小提琴
- 首先,切勿在列中存储逗号分隔的数据。您应该真正规范化您的数据。所以基本上,你可以有一个多对多表映射
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`
以防万一你想知道为什么,它返回 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 |
+----+-------+--------------+
如果您想根据带有 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 作为逗号分隔的列表存储在一个单元格中 - 它应该是外键列以形成正确的关系。那时加入将变得微不足道。