4

我有两张桌子。第一个表是batch在字段“batch”中包含逗号分隔的学生 ID的表

batch
--------------
id      batch 
--------------
1       1,2     
2       3,4

第二个表是标记

marks
----------------------
id  studentid   subject     marks
1     1         English     50
2     2         English     40
3     3         English     70
4     1         Math        65
5     4         English     66
6     5         English     75
7     2         Math        55

我们如何在不使用子查询的情况下找到第一批 id =1 的英语成绩超过 45 分的学生。

我发现使用单个查询完成此操作的问题是我们不能在 JOIN 语句中使用IN作为关联运算符

以下查询需要进行哪些更改才能使其正常工作?

SELECT * FROM batch
INNER JOIN marks ON marks.studentid IN(batch.batch) where batch.id = 1
4

3 回答 3

9
SELECT  m.studentId
FROM    batch b
JOIN    marks m
ON      FIND_IN_SET(m.studentId, b.batch)
        AND m.subject = 'English'
GROUP BY
        m.studentId
HAVING  SUM(marks) > 45
于 2012-06-05T10:46:40.900 回答
0

我认为正确的解决方案是重构学生-批次关系。为什么不将“batch”表的外键添加到“student”表中。学生 1 和 2 将参考批次 1,学生 3 和 4 将参考批次 2。

于 2012-06-05T10:48:55.037 回答
0

您不想在一个数据库字段中存储两个值 - 您违反了第一范式,并且当您尝试使用 SQL 分析数据时会遇到麻烦

我无法完全理解您在使用不同 id 的问题描述中得到了什么 - 但我认为您会希望批处理表更像:

batch
--------------
id      batch 
--------------
1       1
1       2     
2       3
2       4
于 2012-06-05T10:49:24.323 回答