无法使用JOIN选择MySQL的学生排名顺序

时间:2015-03-18 11:56:34

标签: mysql sql database

我有一个问题,MySQL从平均水平上找到学生排名,我的排名是学号,所以如果学生的平均数相等,他们的排名将相同。

表格点

id | using_student_id | using_subject_id | total_point  |
1  | 1                | 1                | 59           | 
2  | 1                | 2                | 53           | 
3  | 2                | 1                | 90           | 
4  | 2                | 2                | 29           |
5  | 3                | 1                | 90           | 
6  | 3                | 2                | 29           |  
-------------------------------------------------------- 

表学生

----------------------------------------------------
id | name   | id        | sex | dob        | class |
1  | sovann | G-000 001 | M   | 1993-03-04 |  1    |
2  | rady ny| G-000 002 | M   | 1992-01-05 |  1    |
3  | dy sove| G-000 003 | M   | 1991-07-03 |  1    |
----------------------------------------------------

表主题

---------------------
id | name   | class |
---------------------
1  | math   | 1     |
2  | english| 1     |
---------------------

我想要的结果:


id | name   |total| avg  | rank | 
1  | sovann | 112 | 56   | 1    | 
2  | rady ny| 119 | 59.5 | 2    | 
3  | dy sove| 119 | 59.5 | 2    |
---------------------------------

这是我试过的查询:

SELECT  s.name as name, sum(p.total_point) as total, avg(p.total_point) as average,
CASE
WHEN @prevRank = avg(p.total_point) THEN @curRank
WHEN @prevRank := avg(p.total_point) THEN @curRank := @curRank + 1
END AS rank

from tbl_point as p 
inner join tbl_student s
on p.uing_student_id = s.id
inner join tbl_subject as su
on su.id = p.using_subject_id,
(SELECT @curRank :=0, @prevRank := NULL) r
group by s.id

结果:

------------------------------------
name   | total  | average | rank   |                     | rank 
sovann | 112    | 56      | 1      | --> result should be|  2
rady ny| 119    | 59.5    | 2      |                     |  1      
dy sove| 119    | 59.5    | 3      |                     |  1
------------------------------------

这是我的表:

-- Dumping structure for table student_db.tbl_class
CREATE TABLE IF NOT EXISTS `tbl_class` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- Dumping data for table student_db.tbl_class: ~3 rows (approximately)
/*!40000 ALTER TABLE `tbl_class` DISABLE KEYS */;
REPLACE INTO `tbl_class` (`id`, `name`) VALUES
    (1, 'Class_one'),
    (2, 'Class_two'),
    (3, 'Class_three');
/*!40000 ALTER TABLE `tbl_class` ENABLE KEYS */;


-- Dumping structure for table student_db.tbl_point
CREATE TABLE IF NOT EXISTS `tbl_point` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `total_point` float DEFAULT NULL,
  `uing_student_id` int(11) NOT NULL,
  `using_subject_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tbl_point_tbl_student_idx` (`uing_student_id`),
  KEY `fk_tbl_point_tbl_subject1_idx` (`using_subject_id`),
  CONSTRAINT `fk_tbl_point_tbl_student` FOREIGN KEY (`uing_student_id`) REFERENCES `tbl_student` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_tbl_point_tbl_subject1` FOREIGN KEY (`using_subject_id`) REFERENCES `tbl_subject` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- Dumping data for table student_db.tbl_point: ~0 rows (approximately)
/*!40000 ALTER TABLE `tbl_point` DISABLE KEYS */;
REPLACE INTO `tbl_point` (`id`, `total_point`, `uing_student_id`, `using_subject_id`) VALUES
    (1, 59, 1, 1),
    (2, 53, 1, 2),
    (3, 90, 2, 1),
    (4, 29, 2, 2),
    (5, 90, 3, 1),
    (6, 29, 3, 2);
/*!40000 ALTER TABLE `tbl_point` ENABLE KEYS */;


-- Dumping structure for table student_db.tbl_student
CREATE TABLE IF NOT EXISTS `tbl_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `student_id` varchar(50) DEFAULT NULL,
  `sext` varchar(45) DEFAULT NULL,
  `dob` date DEFAULT NULL,
  `using_class_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tbl_student_tbl_class1_idx` (`using_class_id`),
  CONSTRAINT `fk_tbl_student_tbl_class1` FOREIGN KEY (`using_class_id`) REFERENCES `tbl_class` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- Dumping data for table student_db.tbl_student: ~0 rows (approximately)
/*!40000 ALTER TABLE `tbl_student` DISABLE KEYS */;
REPLACE INTO `tbl_student` (`id`, `name`, `student_id`, `sext`, `dob`, `using_class_id`) VALUES
    (1, 'sovann', 'G-000 001', 'M', '1993-03-18', 1),
    (2, 'rady ny', 'G-000 002', 'M', '1993-04-14', 1),
    (3, 'dy sove', 'G-000 003', 'M', '1002-05-28', 1);
/*!40000 ALTER TABLE `tbl_student` ENABLE KEYS */;


-- Dumping structure for table student_db.tbl_subject
CREATE TABLE IF NOT EXISTS `tbl_subject` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `using_class_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tbl_subject_tbl_class1_idx` (`using_class_id`),
  CONSTRAINT `fk_tbl_subject_tbl_class1` FOREIGN KEY (`using_class_id`) REFERENCES `tbl_class` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- Dumping data for table student_db.tbl_subject: ~2 rows (approximately)
/*!40000 ALTER TABLE `tbl_subject` DISABLE KEYS */;
REPLACE INTO `tbl_subject` (`id`, `name`, `using_class_id`) VALUES
    (1, 'Math', 1),
    (2, 'Egnlish', 1);

0 个答案:

没有答案