2016-11-15 52 views
0

我简化了mysql的值并给出了值。在这种master_course_id值应该来替代地等所需输出用替代索引值获取mysql值

数据库值

master_course_id register_number 

     1    A1 
     1    A2 
     1    A3 
     2    B1 
     2    B2 
     2    B3 
     3    C1 
     3    C2 
     3    C3 
     4    D1 
     4    D2 
     4    D3 
     5    E1 
     5    E2 
     5    E3 

电流输出

master_course_id register_number 

     1   A1 
     2   B1 
     3   C1 
     4   D1 
     5   E1 
     1   A2 
     2   B2 
     3   C2 
     4   D2 
     5   E2 
     1   A3 
     2   B3 
     3   C3 
     4   D3 
     5   E3 

所需的输出

master_course_id register_number 

     1    A1 
     2    B1 
     1    A2 
     2    B2 
     1    A3 
     2    B3 
     3    C1 
     4    D1 
     3    C2 
     4    D2 
     3    C3 
     4    D3 
     5    E1 
     5    E2 
     5    E3 

MySQL查询

SELECT register_number 
FROM (

     SELECT master_course_id, register_number, 
      @position := IF(master_course_id = @prev_course, @position+1, 1) AS position, 
      @prev_course := master_course_id 
     FROM (SELECT * FROM master 
       WHERE master_course_id IN ('1', '2', '3', '4', '5') 
       ORDER BY master_course_id, register_number) AS m, 
     CROSS JOIN (SELECT @position := 0, @prev_course := null) AS vars 
    ) AS t 
    ORDER BY position, master_course_id 

COURSE_ID 1和2应替代地来首先,如果任一个ID完成意味着它应该移动到下一个ID 3或4同样地,直到结束它应该循环。这意味着course_id或者如何在mysql中实现这个目标

回答

0

在标准SQL中,您可以使用row_number() over (partition by master_course_id order by register_number)来获取master_course_id组中的位置。更加笨拙的是,你可以用下面的查询中所示的子查询来达到同样的效果。

其余的是order by条款符合您的需求。

select master_course_id, register_number 
from 
(
    select 
    master_course_id, 
    register_number, 
    (
     select count(*) 
     from master before 
     where before.master_course_id = master.master_course_id 
     and before.register_number < master.register_number 
    ) as pos_in_course 
    from master 
) data 
order by 
    (master_course_id - 1) DIV 2, -- first id (1|2), then id (3|4), then id (5|6), ... 
    pos_in_course, -- first id (1|2) pos 1, then id (1|2) pos 2, ... 
    master_course_id -- first id 1 pos 1, then id 2 pos 1, then id 1 pos 2, ... 

您可以像您已经尝试的那样对MySQL变量进行相同操作。我无法检查这一点,但我想你的查询已经正确地做到了这一点,你只需要应用合适的order by子句。

在这里,最后是标准的SQL相同的查询:

select master_course_id, register_number 
from master 
order by 
    floor((master_course_id - 1)/2), 
    row_number() over (partition by master_course_id order by register_number), 
    master_course_id; 
+0

HII我努力我会更新 –

+0

采取的想法从这个 –