MySQL中的条件行排名

时间:2015-10-01 07:40:47

标签: mysql group-by

在由数学和科学论文组成的测试中,以下是选择规则:

  • 每个人都应该尝试数学和科学中的一个或两个。
  • 将根据仅解决数学的时间选择那些尝试数学的人。
  • 根据解决科学的时间选择那些不参加数学考试的人。

未尝试的论文被记录为时间= 0,不应计入选择。

--------------------------
 Student | Subject | Time
--------------------------
 1       | S       | 24
 2       | S       | 60
 1       | M       | 65
 2       | M       | 0
 3       | S       | 0
 3       | M       | 0
--------------------------

此处所选的值应为2 - S - 60,因为他没有花费资格尝试的最短时间(科学),因为他没有尝试数学。

如何在单个 MySQL查询中执行此操作?

我不能使用以下内容,因为它们在一个或另一个案例中失败:

SELECT
    student_id, subject_id, time_taken
FROM test_stats
WHERE
    time_taken > 0
ORDER BY
    time_taken ASC,
    subject_id ASC
LIMIT 0, 1;

OR

SELECT
    student_id, subject_id, time_taken
FROM test_stats
WHERE
    time_taken > 0
ORDER BY
    subject_id ASC,
    time_taken ASC,
LIMIT 0, 1;

由于我们无法在群组中设置GROUP BY,因此ORDER BY无效。

如果我需要进一步详细说明,请告诉我。

1 个答案:

答案 0 :(得分:1)

尝试此查询

SELECT student_id, 
SUBSTRING_INDEX(GROUP_CONCAT(subject_id ORDER BY subject_id),',',1) as subject, 
SUBSTRING_INDEX(GROUP_CONCAT(time_taken ORDER BY subject_id),',',1) as time_take
FROM test_stats
WHERE time_taken != 0 
GROUP BY student_id 
ORDER BY time_take ASC 
LIMIT 1 

你已经提到主题偏好应该是数学(M),基于那个

1)GROUP_CONCAT(subject_id ORDER BY subject_id)将是以下任何一个人。  (注意:我在WHERE子句中添加了条件,如time_taken!= 0,所以你不会在这里得到time_taken 0的主题)

  

a)M,S(当学生参加这两个科目时)

     

b)M(当学生单独参加数学课程时)

     

c)S(当学生单独上科学时)

2)和SUBSTRING_INDEX(GROUP_CONCAT(subject_id ORDER BY subject_id),',',1)会给你

  

a)M(当学生参加这两个科目时)

     

b)M(当学生单独参加数学课程时)

     

c)S(当学生单独上科学时)

同样的条件也适合time_taken。