2013-03-27 2 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

Пожалуйста, вы можете объяснить, что вы имеете в виду под " один за другим "? Я не могу видеть логическую связь между указанными вами таблицами и результирующим заказом, который делает советы довольно сложными. –

+0

извините за плохой английский, я имею в виду, если я выберу с порядком по году, то результатом будут студенты с годами 1,1,2,2,3,3,4,4, но я хочу, чтобы заказ показывался в результатах – wizard999

+0

You хотите заказать по «количеству случаев» года, а затем года? Под этим я подразумеваю все первые вхождения всех лет в первую очередь, отсортированные по годам, затем все второстепенные события всех лет также сортируются по годам и т. Д.? – Alkini

ответ

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

first of thx JW, вы всегда здесь, но мне нужны результаты без какого-либо отношения к seat_no, проверьте это http://www.sqlfiddle.com/#!2/b5c24/1, когда я случайно заменил seat_no, – wizard999

+0

, так что что является основой для сортировки записей? –

+0

на основе года, имеющего результат, как я упомянул 1,2,3,4,1,2,3,4, не 1,1,2,2,3,3,4,4 – wizard999

2

Я предполагаю, что вы ва nt для заказа по «количеству случаев» года, а затем года, например. все первые вхождения всех лет, отсортированные по годам, затем все второстепенные события всех лет также сортировались по годам и так далее. Это было бы идеальным случай для эмуляции других аналитических/оконных функций РСУБДА»:

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

+0

@ wizard999 Не забудьте принять ответ! – svidgen

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 
; 
Смежные вопросы