等级表
+----+-------+--------------+
| 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
,请帮忙!!
小提琴
3条答案
按热度按时间qlfbtfca1#
首先,永远不要在列中存储逗号分隔的数据。你真的应该规范你的数据。所以基本上,可以有一个多对多表Map
teacher_to_student
,将有teac_id
以及student_id
柱。在这种特殊情况下,您可以利用
Find_in_set()
功能。从你目前的问题来看,你似乎在试图为一个老师获得总分(他/她的所有学生的总分)。
尝试:
如果你想得到每个学生的总分,你需要加一个
Group By
. 查询如下所示:gmxoilav2#
如果您想根据以逗号分隔的id列表筛选表,我的方法是在列表的开头和结尾以及id的开头和结尾附加额外的逗号,例如。
1
变成,1,
名单就会变成,1,2,3,4,
. 这样做的原因是为了避免含糊不清的匹配,比如1匹配列表中的21或12。也,
EXISTS
在这种情况下非常适合INSTR
功能应起作用:演示
但不应该在一个单元格中以逗号分隔的列表形式存储相关ID—它应该是外键列以形成适当的关系。那么连接就变得微不足道了。
uqdfh47h3#
如果您想知道原因,它返回null的原因是因为子查询作为一个整体返回“1,2,3,4”。你需要的是让它分别返回1,2,3,4。
您的查询返回了什么
你所期望的是
最好的办法就是像@madhur说的那样正常化。在你的情况下,你需要使教师和学生作为一对多的联系