2016-11-15 78 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

採取的想法從這個 –