0

我的桌子

在此处输入图像描述

在这里我想展示

在每个部分中获得最高分的 2 名学生的姓名(C1points 与 C3Points 的总和)。还展示了他们的每场比赛和积分。重复标记也需要显示。

请只查询一个部分。

所以最终输出看起来

在此处输入图像描述

4

2 回答 2

3

这将为您提供单个部分的结果:

SELECT
  Name,
  SUM(C1Points) AS TotalC1,
  SUM(C2Points) AS TotalC2,
  SUM(C3Points) AS TotalC3,
  SUM(C1Points + C2Points + C3Points) AS TotalAll
FROM myTable
WHERE Section = 'Section1'
GROUP BY Name
ORDER BY TotalAll DESC
LIMIT 2

使用 MySQL 一次阅读所有部分是复杂的。最好阅读所有内容并正确排序,然后使用 PHP 获取每个部分的前两行:

SELECT
  Name,
  Section,
  SUM(C1Points) AS TotalC1,
  SUM(C2Points) AS TotalC2,
  SUM(C3Points) AS TotalC3,
  SUM(C1Points + C2Points + C3Points) AS TotalAll
FROM myTable
GROUP BY Name, Section
ORDER BY Section, TotalAll DESC

你会得到这样的结果集:

Section 1 first place name and scores
Section 1 second place name and scores
Section 1 third place name and scores
. . .
Section 1 last place name and scores
Section 2 first place name and scores
Section 2 second place name and scores
and so on...

使用这样排列的列表,获取每个部分的前两行将是 PHP 中的小菜一碟。

于 2013-08-11T02:54:59.303 回答
2

此解决方案将立即为您提供所有部分的输出,您只需要修改表的结构并添加总计

所以想象你有这个

CREATE TABLE STUDENT (NAME VARCHAR(10), SECTION VARCHAR(20), 
                  C1 INTEGER, C2 INTEGER, C3 INTEGER);

INSERT INTO STUDENT VALUES ('S1','Section1',5,0,3),
                ('S2','Section2',0,0,5),
                ('S3','Section3',5,5,5),
                ('S4','Section3',3,3,0),
                ('S5','Section1',5,0,3),
                ('S6','Section2',0,1,0),
                ('S7','Section3',0,0,0),
                ('S8','Section3',5,0,5),
                ('S9','Section1',5,0,3),
                ('S10','Section2',0,3,0),
                ('S11','Section1',3,0,0),
                ('S12','Section3',5,5,5),
                ('S13','Section1',0,1,1),
                ('S14','Section2',3,5,0),
                ('S15','Section3',1,0,0);

现在您需要添加

ALTER TABLE STUDENT ADD COLUMN TOTAL INTEGER;

并更新值

UPDATE STUDENT SET TOTAL = C1+C2+C3;

然后你可以运行这个查询

   SELECT SECTION,
       NAME,
       C1,
       C2,
       C3,
       TOTAL
FROM STUDENT
WHERE CONCAT(SECTION,TOTAL) IN
    (SELECT IDENTIFIER
     FROM
       (SELECT CONCAT(SECTION,MAX(TOTAL)) AS IDENTIFIER,
               SECTION,
               MAX(TOTAL) AS MARKS
        FROM STUDENT
        GROUP BY SECTION
        UNION SELECT CONCAT(SECTION,MAX(TOTAL)) AS IDENTIFIER,
                     SECTION,
                     MAX(TOTAL) AS MAKRS
        FROM STUDENT AS A
        WHERE TOTAL <
            (SELECT MAX(TOTAL)
             FROM STUDENT
             WHERE SECTION = A.SECTION)
        GROUP BY SECTION) AS RESULT)
ORDER BY SECTION,
         TOTAL DESC

你可以看到结果

在此处输入图像描述

http://www.sqlfiddle.com/#!2/f18e1/24/0

希望这会有所帮助,根本不需要 PHP,尽管在 PHP 或其他服务器端脚本中执行部分操作实际上可能更有效

于 2013-08-11T03:31:15.907 回答