Mysql的功能

Mysql的功能,mysql,sql,null,Mysql,Sql,Null,类表 +----+-------+--------------+ | id |teac_id| student_id | +----+-------+--------------+ | 1 | 1 | 1,2,3,4 | +----+-------+--------------+ 学生分数 +----+----------+--------+ | id |student_id| marks | +----+----------+--------+ | 1 | 1

类表

+----+-------+--------------+
| 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
,请帮助

  • 首先,永远不要在列中存储逗号分隔的数据。你真的应该。因此,基本上,您可以有一个多对多表映射
    teacher\u-to\u-student
    ,其中将有
    teac\u id
    student\u id
  • 在这种特殊情况下,您可以利用函数
从您当前的查询中,似乎您正在尝试获取一名教师的总分(将他/她的所有学生的分数相加)

尝试:

如果您想获得每个学生的总分,您需要添加一个
分组依据
。查询如下所示:

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`
  • 首先,永远不要在列中存储逗号分隔的数据。你真的应该。因此,基本上,您可以有一个多对多表映射
    teacher\u-to\u-student
    ,其中将有
    teac\u id
    student\u id
  • 在这种特殊情况下,您可以利用函数
从您当前的查询中,似乎您正在尝试获取一名教师的总分(将他/她的所有学生的分数相加)

尝试:

如果您想获得每个学生的总分,您需要添加一个
分组依据
。查询如下所示:

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

以防您想知道为什么,它返回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个匹配

另外,
存在
非常适合这种情况,它与
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作为逗号分隔列表存储在一个单元格中-它应该是外键列以形成正确的关系。连接将变得微不足道。

如果您想根据ID为的逗号分隔列表筛选表,我的方法是 在列表的开头和结尾以及ID的开头和结尾追加额外的逗号,例如。
1
变成
,1,
,列表变成
,1,2,3,4,
。这样做的原因是为了避免含糊不清的匹配,例如列表中的1个匹配21或12个匹配

另外,
存在
非常适合这种情况,它与
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作为逗号分隔列表存储在一个单元格中-它应该是外键列以形成正确的关系。那么连接就变得微不足道了。

学生id是怎么回事?永远不要将数据存储为逗号分隔的项目。这只会给你带来很多麻烦。
student\u id
怎么了?永远不要将数据存储为逗号分隔的项目。这只会给你带来很多麻烦。