2013-08-22 1 views
0

동점 순위를 계산하는 데 다음 코드가 있습니다. 이 코드 순위는 Mark_score의 합계로 계산됩니다. 내가 알고 싶은 것은 각 주제에서 mark_scored로 순위를 산정 할 수있는 방법입니다. 한 학생이 단 하나의 과목에서 실패하지만 모든 과목을 통과 한 다른 학생의 점수보다 점수가 더 높아질 수 있습니다. 따라서 그러한 경우, 모든 과목에서 합격 한 사람은 총점 점수가 높은 사람보다 높은 순위에 있어야합니다. 이 코드는 내가 지금까지 시도해 왔으며 내가 원하는 것을 어떻게 얻을 수 있을지 전혀 모른다. 나는 Google에서 검색 중이며 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 
+0

학생이 합격했는지 실패했는지 알 수있는 필드는 무엇입니까? –

+0

@Dan Bracuk, 패스 마크는 mark_scored의 35 %로 주어집니다. –

답변

1

사용자 지정 비교 함수를 사용하여 출력을 정렬하는 것입니다. 모든 과목을 이수한 모든 학생들이 과목에 불합격 한 학생보다 높은 순위에 올랐습니까? 이것은 비교 기능 코드에서 중요합니다.

PHP에서 사용자 정의 비교 기능을 사용하여 정렬 할 수 있습니다. 그러나 로컬 SQL dialect에 함수를 작성할 수 있다면 PHP보다 빠를 수도 있습니다.

+0

새로운 mysql 코드로 게시물을 업데이트하고 지금까지 내가 한 것을 보여줄 것입니다. –

+1

Lighton Fisher, 업데이트 된 코드에서 볼 수 있듯이 한 주제에 대한 순위를 찾는 방법을 알고 있습니다. 그러나 나는 각 과목에서 합격 점수가 35 %라는 조건하에 모든 과목의 순위를 찾고 싶습니다. 한 학생이 모든 과목에서 합격 점수를 획득하면 그의 랭크가 계산됩니다. 그리고 다른 한 학생이 더 많은 점수를 얻었지만 (모든 과목에서 얻은 점수의 합) 하나의 과목에서 실패했습니다. 그것은 그가 실패하고 그의 계급이 그에 따라 고려되거나 계산되지 않는다는 것을 의미합니다. 나는 'IF'를 사용하여 SQL 문을 작성하는 데 약하다. 예를 보여 주면 최소한의 노력 만 할 수 있다고 생각합니다. –