解決策の背後にあるアイデアは、プロバイダーに基づいて1から順番に番号を付けられるようにすることです。タイプ「a」の行が1..4から番号が付けられ、行がタイプ「b」の場合は1から3、行がタイプ「c」の場合は1..3から番号が付けられます。あなたはこれらの数字で「注文」を使用したいと思っていました。
この例では、テーブル名が「my_table」であり、typeとdataの2つのフィールドがあるとします。
MySQLでROWNUMを作るために、私はここに記載されたものを使用します。rownum in mysql
は今、私たちはタイプとすべての行を選択するとします「」とそれらを昇順行番号を与えることができます。我々は次のようにそれを行うことができます。
select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'
は、我々はその後、労働組合のすべての結果を、他のタイプのために同じことを行う、その後、それは順序がない選択外でそれらをラップすることができます。各タイプのために、我々はカウンターを行うには別の変数を定義することを
select type,data
from
(
select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'
union all
select type,data,@rownumb := @rownumb+1 as order_num
from my_table,(select @rownumb:=0) rb
where type='b'
union all
select type,data,@rownumc := @rownumc+1 as order_num
from my_table,(select @rownumc:=0) rc
where type='c'
) in_tab
order by order_num,type
注:あなたの質問への答えは次のクエリになります。
最後の注意として、同じ結合内のすべてのカウンタを定義してからunion allを使用するのではなく、そのタイプに基づいて正しい変数を使用することができます。次はあなたがの一部であるすべてのサブクエリでそれらを繰り返す必要がないので、行を選択するためのより多くの条件(WHERE句)を持っている場合は同じクエリ
select type,data
from
(
select type,data,
case when type='a' then @rownuma := @rownuma+1
when type='b' then @rownumb := @rownumb+1
when type='c' then @rownumc := @rownumc+1
end as order_num
from my_table, (select @rownuma:=0) ra, (select @rownumb:=0) rb, (select @rownumc:=0) rc
) in_tab
order by order_num,type
番目のバージョンは、さらに良いです最初のバージョンの組合。
主キーがあり、abcabcabcの順番で行を追加できる場合は、参照しているテーブルの構造を指定した場合に役立ちます。次に、主キーで単純にソートできます。 – Steve
テーブルにはプライマリキーがありますが、正しい順序で挿入するのは容易ではありません – Jab
"ランダム"な順序付けをしたくないので、2つの同じ値が連続するのを避けたいですか?データが「a a a a b c」の場合はどうなりますか?たぶん私はその質問を誤解しました。いずれにしても、明確化と明確な仕様が必要です。 –