我一直在尝试创建一个查询,以显示表中与我的查询相对应的行并获取它们的结果,但它不起作用,因为它只显示一行。我的查询是:
SELECT *, sum(marks)
FROM studentresult, subject
where studentresult.term='1'
and studentresult.studentid='2'
and studentresult.year='2015'
and studentresult.subjectid = subject.id
应该是这样的:
Subjectid | Studentid | Marks | Term | Year
1 | 2 | 99 | 1 | 2015
1 | 2 | 2 | 1 | 2015
101
但它是这样显示的:
Subjectid | Studentid | Marks | Term | Year | Sum(mark)
1 | 2 | 99 | 1 | 2015 | 101
有人能帮我吗
提前感谢
rgds
Akshat
SELECT subjectId, studentID, marks, term, Year, sum(marks)
FROM studentresult SR
LEFT JOIN subject S
where sr.term='1'
and sr.studentid='2'
and sr.year='2015'
and sr.subjectid = subject.id
Group by subjectId, studentID, marks, term, Year
我不确定哪些表有哪些列,所以您需要调整。。。但是您需要一个groupby来获取多行,或者mysqlgroupby扩展将随机选择非聚合列中的值。通常,您需要按select中的所有非聚合列进行分组,前提是它们具有不同的值。如果它们具有相同的值,那么mysql扩展组可以处理它,并且在组中不需要它们
从逻辑上讲,在这种情况下,我认为你预期结果中的所有值都应该在小组中,因为你可能有同一个人,在多年的时间里。标记是唯一可以排除的值。
现在我看到你想要一笔分数。。。由于mySQL没有窗口集逻辑,我们必须进行子选择才能获得该值。使用over
语法。。。这个窗口化的集合逻辑允许您在不影响主查询结果的情况下进行内联聚合。由于mySQL不支持它,我们使用了一个subselect。
当我切换到使用INNER JOIN语法与,
表示法时,两者都可以工作;我只是对内部联接语法比较熟悉。
SELECT subjectId, studentID, marks, term, Year, sMarks
FROM studentresult SR
INNER JOIN subject S
on SR.subjectid = s.id
INNER JOIN (SELECT sum(Marks) smarks, Year, Term, StudentID, Subject
FROM studentResult
GROUP BY Year, Term, StudentID, Subject) Sub
ON SR.studentID =Sub.StudentID
and SR.Subject = Sub.Subject
and SR.Year = Sub.Year
and SR.Term = Sub.Term
WHERE SR.term='1'
and SR.studentid='2'
and SR.year='2015'
我知道你已经接受了一个答案,但只是想让你知道,事实上,你可以实现你想要的。此外,由于您不从主题表中检索任何数据,因此可以删除它的联接
SQL Fiddle
MySQL 5.5.32架构设置:
CREATE TABLE studentresult
(`Subjectid` int, `Studentid` int, `Marks` int, `Term` int, `Year` int)
;
INSERT INTO studentresult
(`Subjectid`, `Studentid`, `Marks`, `Term`, `Year`)
VALUES
(1, 2, 99, 1, 2015),
(1, 2, 2, 1, 2015)
;
CREATE TABLE subject
(`id` int, `Subject` varchar(8))
;
INSERT INTO subject
(`id`, `Subject`)
VALUES
(1, 'Whatever')
;
查询1:
SELECT subjectId, studentID, marks, term, Year
FROM studentresult
INNER JOIN subject ON studentresult.subjectid = subject.id
WHERE term='1'
and studentid='2'
and year='2015'
UNION
SELECT '', '', sum(marks), '', ''
FROM studentresult
INNER JOIN subject ON studentresult.subjectid = subject.id
WHERE term='1'
and studentid='2'
and year='2015'
GROUP BY subjectId, studentID, term, Year
ORDER BY marks
结果:
| SUBJECTID | STUDENTID | MARKS | TERM | YEAR |
|-----------|-----------|-------|------|------|
| 1 | 2 | 2 | 1 | 2015 |
| 1 | 2 | 99 | 1 | 2015 |
| | | 101 | | |
先生,我必须告诉您,您不能在查询后附加自定义行。表(查询结果)已联接。结果显示正确。您需要将查询划分为2个子查询:
SELECT *
FROM studentresult, subject
where studentresult.term='1'
and studentresult.studentid='2'
and studentresult.year='2015'
and studentresult.subjectid = subject.id
为了得到你可以得到的总和:
SELECT sum(marks)
FROM studentresult, subject
where studentresult.term='1'
and studentresult.studentid='2'
and studentresult.year='2015'
and studentresult.subjectid = subject.id
这是更好的方法。只是为了让你知道加入查询并不总是有效的。。。