MySQL& PHP:Sum(标记)和where子句

时间:2015-02-13 14:56:37

标签: php mysql

我一直在尝试进行查询以显示表中与我的查询相对应的行并获得结果,但它不起作用,因为它只显示一行。 我的询问是:

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

3 个答案:

答案 0 :(得分:1)

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

我不确定哪些表有什么列,所以你需要调整这个......但你需要一个group by来获取多行或mysql group by extension将随机选择非聚合的值列。通常,您需要按选择中的所有非聚合列进行分组,前提是它们具有不同的值。如果它们具有相同的值,则mysql group by extension可以处理它,并且在group by中不需要它们。

从逻辑上讲,在这种情况下,我认为您的预期结果中的所有值都应该在群组中,因为您可能拥有同一个人,多年和多个条款。马克是唯一可以排除的价值。

现在我看到你想要一个标记总和...我们将不得不做一个子选择来获得该值,因为mySQL没有窗口设置逻辑。使用over语法...这个窗口化的集合逻辑允许您在不影响主查询结果的情况下进行内联聚合。由于mySQL不支持它,我们使用子选择。

当我切换到使用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' 

答案 1 :(得分:1)

我知道你已经接受了答案,但只是为了让你知道,事实上,你可以完全达到你想要的效果。此外,由于您无法从主题表中检索任何数据,因此可以删除对其的连接。

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

<强> Results

| SUBJECTID | STUDENTID | MARKS | TERM | YEAR |
|-----------|-----------|-------|------|------|
|         1 |         2 |     2 |    1 | 2015 |
|         1 |         2 |    99 |    1 | 2015 |
|           |           |   101 |      |      |

答案 2 :(得分:0)

我必须告诉你,先生你的查询后不能追加自定义行。表(查询结果)已连接。结果显示正确。您需要将查询分为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

这是更好的方法。只是因为您知道加入查询并不总是有效...