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 |
+--------------+------+
4

3 に答える 3

2

私は、あなたがその年の「発生回数」で並べ替えたいと仮定しています。例えば、最初にすべての年のすべての最初の発生を年でソートし、次にすべての年のすべての 2 回目の発生も年でソートします。 、 等々。これは、他の 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

MySQLを使用した分析 (AKA ランキング) 関数のエミュレートは、より多くの背景と説明を提供する優れた記事です。

于 2013-03-27T14:41:01.907 に答える
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
于 2013-03-27T12:18:25.690 に答える
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
;

現在使用しているテーブルを使用すると、「コア シート番号」が 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
;
于 2013-03-27T15:02:18.520 に答える