2013-03-27 116 views
1

有序域给出一个* students_exam_rooms *表:交替选择行从另一个表

+------------+---------+---------+ 
| student_id | room_id | seat_no | 
+------------+---------+---------+ 
|   1 |  30 | 1001 | 
|   2 |  30 | 1002 | 
|   3 |  31 | 2001 | 
|   4 |  32 | 2002 | 
|   5 |  33 | 3001 | 
|   6 |  33 | 3002 | 
|   7 |  34 | 4001 | 
|   8 |  34 | 4002 | 
+------------+---------+---------+ 

而* students_tbl *:

+------------+-------------+------+ 
| student_id | studen_name | year | 
+------------+-------------+------+ 
|   1 | Eric  | 1 | 
|   2 | Mustafa  | 1 | 
|   3 | Michael  | 2 | 
|   4 | Andy  | 2 | 
|   5 | Rafael  | 3 | 
|   6 | Mark  | 3 | 
|   7 | Jack  | 4 | 
|   8 | peter  | 4 | 
+------------+-------------+------+ 

如何从* students_exam_rooms选​​择*由* students_tbl排序.year *但是一个接一个是这样的:

+--------------+------+ 
| student_name | year | 
+--------------+------+ 
| Eric   | 1 | 
| Michael  | 2 | 
| Rafael  | 3 | 
| Jack   | 4 | 
| Mustafa  | 1 | 
| Andy   | 2 | 
| Mark   | 3 | 
| Peter  | 4 | 
+--------------+------+ 
+1

请你能解释一下你的意思“一个接一个“?我无法真正看到你所提到的表格和由此产生的建议顺序之间的逻辑联系,这使得建议非常棘手。 – 2013-03-27 12:11:38

+0

对英语不好,对不起,我的意思是如果我选择按年度顺序,结果将是年数为1,1,2,2,3,3,4,4的学生,但我希望在结果中显示的顺序 – wizard999 2013-03-27 12:15:25

+0

您想按年份和那一年的“发生次数”排序?我的意思是指所有年份中首次出现的所有年份,按年份排序,然后所有年份的所有次要出版物也按年份排序,依此类推? – Alkini 2013-03-27 14:28:38

回答

1

请尝试以下任意一项:

SELECT a.studen_name, a.year 
FROM students_tbl a 
     INNER JOIN students_exam_rooms b 
      ON a.student_id = b.student_id 
ORDER BY REVERSE(b.seat_no), 
      a.year 

使用Modulo

SELECT a.studen_name, a.year 
FROM students_tbl a 
     INNER JOIN students_exam_rooms b 
      ON a.student_id = b.student_id 
ORDER BY CASE WHEN MOD(b.seat_no, 2) <> 0 THEN 0 ELSE 1 END, 
      a.year 
+0

thx的第一个JW,你总是在这里,但我想要的结果与seat_no没有任何关系,请检查此http://www.sqlfiddle.com/#!2/b5c24/1当我随机更换seat_no时, – wizard999 2013-03-27 12:30:38

+0

如此排序记录的基础是什么? – 2013-03-27 12:56:47

+0

基于年结果我提到1,2,3,4,1,2,3,4不是1,1,2,2,3,3,4,4 – wizard999 2013-03-27 13:05:42

2

我假设你はnt按照年份和年份的“发生次数”排序,例如所有年份中首次出现的所有年份,按年份排序,然后所有年份中的所有次数也按年份排序,依此类推。这将是仿效其他RDBMS”分析/窗口化功能的完美案例:

select * 
from (
    select 
     s.studen_name, 
     s.year, 
     ser.*, 
     (
      select 1 + count(*) 
      from students_tbl s2 
      where s.year = s2.year 
       and s.student_id > s2.student_id 
     ) rank 
    from students_tbl s 
     JOIN students_exam_rooms ser 
      ON s.student_id = ser.student_id 
) i_dont_really_want_to_name_this 
order by rank, year 

这对JW的小提琴轻微扭捏版本:http://www.sqlfiddle.com/#!2/27c91/1

Emulating Analytic (AKA Ranking) Functions with MySQL是一个很好的文章,让更多的背景和说明。

+0

谢谢,就是这样,我知道它是有点混淆我的问题和我的英语 – wizard999 2013-03-27 15:03:44

+0

@ wizard999不要忘记接受答案! – svidgen 2013-03-27 15:51:10

0

在我看来,你试图按座位排序,然后按年排序。看看你的students_exam_rooms表格,它看起来像是从一个简单的座位号开始的,并且以前为year * 1000。所以,如果我们忽略的一年,它看起来像这样:

> select * from fixed_students_exam_rooms; 
+------------+---------+---------+ 
| student_id | room_id | seat_no | 
+------------+---------+---------+ 
|   1 |  30 |  1 | 
|   2 |  30 |  2 | 
|   3 |  31 |  1 | 
|   4 |  32 |  2 | 
|   5 |  33 |  1 | 
|   6 |  33 |  2 | 
|   7 |  34 |  1 | 
|   8 |  34 |  2 | 
+------------+---------+---------+ 

如果你有表,查询很简单:

select 
    student_name, year 

from 
    modified_student_exame_rooms 
    left join students_tbl using (student_id) 

order by 
    seat_no, year 
; 

使用表,你现在有它,它只是稍微复杂一些,假设“核心座位号”不excede 999

select 
    student_name, year 

from 
    modified_student_exame_rooms 
    left join students_tbl using (student_id) 

order by 
    convert(substr(seat_no, 2), unsigned), 
    year 
;