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
怎么了?永远不要将数据存储为逗号分隔的项目。这只会给你带来很多麻烦。