2012-03-11 7 views
1

私のウェブページ上で私は日付ベースのデータを取得し、結果ページにこれを表示します。私は、結果を並べ替えると、順番に(Google翻訳の翻訳thats)したいと思います。私が意味することは:私は "タイプ"と呼ばれるフィールドを持っていて、それは値a、bまたはcを持っています。私は、データを選択すると、それはrandomise SQLの結果

aaaabbbccc

として結果を返しますが、私は

abcabcabca

私の質問、このための最善の解決策は、(と、それは可能何ですとしてそれを見るのが好きSQLクエリ?)

ありがとうございます!

+0

主キーがあり、abcabcabcの順番で行を追加できる場合は、参照しているテーブルの構造を指定した場合に役立ちます。次に、主キーで単純にソートできます。 – Steve

+0

テーブルにはプライマリキーがありますが、正しい順序で挿入するのは容易ではありません – Jab

+0

"ランダム"な順序付けをしたくないので、2つの同じ値が連続するのを避けたいですか?データが「a a a a b c」の場合はどうなりますか?たぶん私はその質問を誤解しました。いずれにしても、明確化と明確な仕様が必要です。 –

答えて

0

解決策の背後にあるアイデアは、プロバイダーに基づいて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 

番目のバージョンは、さらに良いです最初のバージョンの組合。

+0

これは完璧な仕事です!どうもありがとうございました!私はスクリプトの作業は完全に理解していませんが。私は次のことを正しく覚えています:最初の選択はすべてのデータを選択し、2番目の選択はswitch文と同様のステートメントで選択されたすべてのデータを実行します。タイプが同じであれば、それに数値が与えられ、order_numに一時的に保存されます。 2番目の後の部分は私が理解していない部分です。あなたが望むなら、これを説明して、私はそれを完全に理解するでしょうか? – Jab

+0

「2番目の選択」と呼ばれるものがサブクエリです。最初に実行され、すべてのデータが収集され、order_numが割り当てられます。 hihger selectが実行され、order_numフィールドで「order by」を使用してデータをソートすることができます。 –