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

いずれか1つのIDが終了した場合Course_IDに1及び2は、代替的に最初に来る必要があり、それはループべき最後まで同様に次のID 3または4に移動しなければならないことを意味します。つまり、mysqlでこれを達成する方法を教えてください。

答えて

0

標準SQLでは、register_numberの位置をmaster_course_idグループ内に取得するには、row_number() over (partition by master_course_id order by register_number)を使用します。下のクエリで示されているように、サブクエリで同じことを実現できます。

残りはお客様のニーズに合ったです。

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

はここからアイデアをとっているが更新されますしようとしています –

関連する問題