Php 根据关系和条件排名

Php 根据关系和条件排名,php,mysql,sql,Php,Mysql,Sql,我有下面的代码来计算排名与联系。在本规范中,排名是根据Mark_分数之和计算得出的。我想知道的是:我们如何根据每个科目的分数计算排名。有一段时间,一个学生可能只在一门学科上不及格,但他的分数总和要高于其他所有学科都及格的学生。因此,在这种情况下,通过所有科目的人的排名必须高于总分较高的人。这段代码是我迄今为止一直在尝试的,我不知道如何才能实现我想要的。我在谷歌上搜索,可能是世界上所有提供mysql教程但找不到解决方案的网站。请帮帮我。Php解决方案或任何其他建议也是受欢迎的。请参阅我的代码: S

我有下面的代码来计算排名与联系。在本规范中,排名是根据Mark_分数之和计算得出的。我想知道的是:我们如何根据每个科目的分数计算排名。有一段时间,一个学生可能只在一门学科上不及格,但他的分数总和要高于其他所有学科都及格的学生。因此,在这种情况下,通过所有科目的人的排名必须高于总分较高的人。这段代码是我迄今为止一直在尝试的,我不知道如何才能实现我想要的。我在谷歌上搜索,可能是世界上所有提供mysql教程但找不到解决方案的网站。请帮帮我。Php解决方案或任何其他建议也是受欢迎的。请参阅我的代码:

SELECT regd, Roll_no, Name_of_Student, Section, Test_date,
       English,
       Mizo,
       Mathematics,
       SS,
       Science,
       score, fmscore, perc, Rank 
FROM 
(
  SELECT t.*, IF(@p = score, @n, @n := @n + 1) AS Rank, @p := score 
    FROM
  (
    SELECT regd, Roll_no, Name_of_Student, Test_date, Section,
            SUM(IF(Subject = 'English'    , Mark_score, 0)) English,
            SUM(IF(Subject = 'Mizo'       , Mark_score, 0)) Mizo,
            SUM(IF(Subject = 'Mathematics', Mark_score, 0)) Mathematics, 
            SUM(IF(Subject = 'SS'         , Mark_score, 0)) SS,
            SUM(IF(Subject = 'Science'    , Mark_score, 0)) Science,
            SUM(Full_mark) fmscore,
            SUM(Mark_score) score,
            SUM(Mark_score) / SUM(Full_mark) * 100 perc 
      FROM exam, (SELECT @n := 0, @p := 0) n 
     GROUP BY regd 
     ORDER BY score DESC
  ) t
) r
这是我的桌子:

  CREATE TABLE IF NOT EXISTS `exam` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `regd` int(11) NOT NULL,
 `Name_of_Student` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `Class` varchar(50) COLLATE latin1_general_ci NOT NULL,
 `Roll_no` int(11) NOT NULL,
 `Section` varchar(50) COLLATE latin1_general_ci NOT NULL,
 `Name_of_exam` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `Test_date` date NOT NULL,
 `Subject` varchar(50) COLLATE latin1_general_ci NOT NULL,
 `Full_mark` int(11) NOT NULL,
 `Mark_score` int(11) NOT NULL,
 `Year` year(4) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=505 ;
样本数据:

INSERT INTO `exam` (`id`, `regd`, `Name_of_Student`, `Class`, `Roll_no`, `Section`, `Name_of_exam`, `Test_date`, `Subject`, `Full_mark`, `Mark_score`, `Year`) VALUES
(1, 2147, 'Lalrinawmi', 'IX', 1, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 28, 2013),
(2, 2149, 'R.Lalruatfela', 'IX', 2, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(3, 2152, 'Lallawmtlinga', 'IX', 3, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 25, 2013),
(4, 2153, 'Malsawmdawngzela', 'IX', 4, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(5, 2154, 'Lincoln Lalduhsaka', 'IX', 5, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 22, 2013),
(6, 2157, 'Vanlalhriatpuia Hrahsel', 'IX', 6, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(7, 2158, 'C.Malsawmtluanga', 'IX', 7, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(8, 2162, 'C.M.S. Dawngliana', 'IX', 8, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 26, 2013),
(9, 2165, 'B. Malsawmkimi', 'IX', 9, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(10, 2164, 'Lalnunmawii', 'IX', 10, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 20, 2013),
(11, 2167, 'Hmangaihenlaii', 'IX', 11, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 29, 2013),
(12, 2170, 'Lalrinsangi', 'IX', 12, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 26, 2013),
(13, 2166, 'John Malsawmtluanga', 'IX', 13, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 27, 2013),
(14, 2171, 'Malsawmtluangi', 'IX', 14, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 26, 2013),
(15, 2173, 'Azid Ahmed Barbhuiya', 'IX', 15, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(16, 2174, 'John Lalramdina', 'IX', 16, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 26, 2013),
(17, 2175, 'B. Lalrotlinga', 'IX', 17, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(18, 2176, 'Rebec Lalremruati', 'IX', 18, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(19, 2177, 'Hmingthanmawii', 'IX', 19, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(20, 2178, 'Johny Lalbiakzuala', 'IX', 20, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(21, 2179, 'Lalrinfela', 'IX', 21, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(22, 2181, 'Lalremruata', 'IX', 22, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(23, 2182, 'Isaac Lalmuankima', 'IX', 23, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 20, 2013),
(24, 2185, 'Lalduhsaka', 'IX', 24, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 20, 2013),
(25, 2186, 'Lalrinfeli', 'IX', 25, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 20, 2013),
(26, 2187, 'Lalnunhlui', 'IX', 26, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 20, 2013),
(27, 2188, 'Liantinthanga', 'IX', 27, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(28, 2190, 'C.Lalmuanpuii', 'IX', 28, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 21, 2013),
(29, 2193, 'Lalramzailawma', 'IX', 29, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 23, 2013),
(30, 2194, 'Malsawmpuia', 'IX', 30, 'A', 'First Term Unit Test', '2013-07-23', 'English', 30, 26, 2013);
在一个科目中查找排名:

SELECT regd, Roll_no, Name_of_Student, Subject,
   score, Rank 
FROM 
(
  SELECT t.*, IF(@p = score, @n, @n := @n + 1) AS Rank, @p := score 
  FROM
  (
   SELECT regd, Roll_no, Name_of_Student, Subject,
        SUM(Mark_score) score
  FROM exam, (SELECT @n := 0, @p := 0) n
  Where Subject='English' 
 GROUP BY regd 
 ORDER BY score DESC
   ) t
) r

您需要的是使用自定义比较函数对输出进行排序。是否所有通过所有课程的学生的排名都高于任何学科不及格的学生?这在比较函数代码中很重要


这种带有自定义比较函数的排序可以在PHP中完成。但是,如果你能用你当地的SQL方言编写函数,它可能会比PHP快。

哪些字段告诉你该学生是通过了还是失败了?@Dan Bracuk,通过分数将为mark_分数的35%。我将用新的mysql代码更新帖子,并向你展示我迄今为止所做的工作。..Lighton Fisher,正如您在我更新的代码中所看到的,我知道如何找到一个主题的排名。但我想一次过找到所有科目的排名,条件是每个科目的及格分数为35%。如果一名学生在所有科目中都获得及格分数,他的排名将被计算。另一名学生的总分(所有科目的总分)较高,但有一门科目不及格;这意味着他失败了,他的军衔将不会得到相应的考虑或计算。我在使用
IF
编写sql语句方面很弱。只要给我举个例子,我想我至少能解决这个问题。