
お世話になります。
SQLite3で、テーブル中のレコードをランダムに
並び替えた後、その順番で1から番号を入れて
いきたいのですが、それを少手順でできるSQL等は
ありますでしょうか。
例えば、
1,りんご,0
2,いちご,0
3,いちじく,0
4,トマト,0
5,ほうれんそう,0
等とあった場合、一番最後の場所に、
3,いちじく,1
5,ほうれんそう,2
2,いちご,3
1,りんご,4
4,トマト,5
…と、1から順に番号を振りたいのです。
勿論、一つ一つ順を追っていけば、できない事ではありませんが、
頻繁に繰り返して行いたいのでできれば軽く、早くしたいのですが…。
良い方法がありましたらお教えください。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
> 対人戦でなく、CPUを相手にするゲームなのですが、対戦する相手を
> ランダムで順番に対戦相手の中から選ぼうとしています。
>
> ただ、それだけなら一件一件ランダムで拾えばいいと思われますが、
> 一度勝ち進んできた対戦相手とさかのぼってもう一度やってみたいと
> いう機能を付けてみたいと思っています。
> そのため、どういう順番で対戦相手が出てきたかの履歴が必要になります。
なるほど、そういう背景があるんですね。
でも、それだったらランダムが必要なのはゲームの開始時ではなく新規の対戦相手の選択時ですよね。
自分だったら、現在のテーブル構成でという制約なら 3 番目の列名を「対戦順」と呼ぶとして
(1)ゲーム開始時に全レコードの「対戦順」を未対戦を表す値に設定する。
(2)新規対戦時にはテーブルから「対戦順」が未対戦のものを捜し、その中からランダムに選択する。そののちその選択したレコードの「対戦順」を新規対戦が何番目かの値に書き換える。
(3)過去にさかのぼって対戦する場合には「対戦順」が未対戦ではないものを「対戦順」でソートして捜し、その中から一つを選ばせる。
(4)次の対戦相手は「対戦順」が現在の対戦順 +1 のものを捜し、見つかればその対戦相手を選択する。見つからなければ新規対戦として (2) を行う。
という風にしますしあなたもその案を考慮したでしょうが、そのうえであえて『データベースのフィールドにランダムでインデクスを振る』理由はなにかございますでしょうか。
この回答への補足
ありがとうございます。
いわれてみると、お教えいただいた方法で実現できそうです。
しかし申し訳ございません。
自分の腕試しとしてでもあり、勉強のため…ということでも
あるのですが、ゲーム開始のはじめに対戦相手順がはじめから
決まっている場合はどうでしょうか。サッカーの
ワールドカップのように、トーナメント方式で勝ち進む場合には、
はじめから対戦相手の組み合わせがわかっているわけです。
飽く迄、一回戦毎に勝ち進むという仕様は変更ありませんが、
ゲームの中の対戦順ごとに、先の相手と戦うために、序盤のうちから
先の相手を見通して戦う…、欲を言ってしまえばきりがありませんが、
履歴だけでなく、先の相手も知ることができるといった感じです。
繰り返すようで申し訳ありませんが、『もし軽く、早く行うためには』
ということですので、特に有効な手段はないというのでしたら、
速度などはあきらめ、一つ一つ行っていこうと思っています。
一度プログラム側でデータを受け取り、ランダムに並び替えた後で、
その順に1から番号を振っていく…という感じでしょうか。
今回は実用性よりは、スキルアップとして取り組めればと思って、
この質問を出させていただきました。確かに、現実的な仕様では
ありませんが、『こういう仕様もある』ということで、提案していただければ
幸いです。
よろしくお願いいたします。
No.3
- 回答日時:
> #2 補足
ふむ、ならばこちらよりも「その他(データベース) 」カテゴリで質問されると適切な回答が得られるのではないかと思います。
自分も SQL のエキスパートというわけではありませんので。
ただ
> 一度プログラム側でデータを受け取り、ランダムに並び替えた後で、
> その順に1から番号を振っていく…という感じでしょうか。
については、ランダムの並び替えは SQL の SELECT 時に ORDER BY random() で行えます。
さすがに特定のキャラをラスボスにとかいうように並び順に手を入れたいならば、それはプログラム側でやる方が適切ではないかと思いますが。
お礼が遅れ、大変申し訳ございません。
丁寧な回答、ありがとうございます。
最初の質問の時のように、一つ一つ順を追っていけば
できないことではないので、難しいことではないのですが、
ある種『応用』ということで質問させていただきました。
何度もありがとうございました。
教えていただいた例をもとに、再度検討してみたいと思います。
No.1
- 回答日時:
> テーブル中のレコードをランダムに並び替え
……?
SQLite に限らず、RDB にはテーブル中のレコードには並び順なんてありませんが……。
ORDER BY を付けない場合、レコードの並び順なんてデータの追加・削除で変わることは珍しくありません。
なぜレコードをランダムに並べ替えた結果がほしいのか、その結果を使ってやりたいことを、「頻繁に繰り返して行いたい」理由も含めて補足願います。
この回答への補足
ご返答、ありがとうございます。
説明が不足しており、大変申し訳ありません。
この用途は、Androidでミニゲームを作ろうと思っています。
ご存知の通り、AndroidはSQLiteを標準で使用できますし、
ゲームといったことから、『ランダム』という要素は切り離せません。
対人戦でなく、CPUを相手にするゲームなのですが、対戦する相手を
ランダムで順番に対戦相手の中から選ぼうとしています。
ただ、それだけなら一件一件ランダムで拾えばいいと思われますが、
一度勝ち進んできた対戦相手とさかのぼってもう一度やってみたいと
いう機能を付けてみたいと思っています。
そのため、どういう順番で対戦相手が出てきたかの履歴が必要になります。
今の状況なら、その対戦相手の数も10人そこそこのため、Androidの
アプリ本体に配列だのなんだので残してもいいのですが、
自分の腕慣らしの為もかねて、あえてデータベースに順番を残して、
過去にいつでもさかのぼれるようにとしたいのです。
質問文にも書きましたが、一つ一つ行うだけなら、難しいことは
ないと思いますが、要はゲームというアプリの為であり、また
自分のスキルの再確認の為でもあり、速度と軽量を重視しています。
ただ、私は技術者ではありません。
用途は以上になりますが、行いたいのは飽く迄
『データベースのフィールドにランダムでインデクスを振る』方法です。
長文になりましたが、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
- その他(Microsoft Office) 同じ番号に並び替え 1 2022/10/21 22:37
- スピーカー・コンポ・ステレオ レコードのマトリクス番号の見方を教えてください。 最近レコードの知識が少しずつ増え、最近マトリクス番 1 2022/08/14 13:58
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Excel(エクセル) Excel 郵便番号順に並び変えたい 同じ番号が複数あるとき 4 2022/04/28 18:35
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- その他(Microsoft Office) 逆順 3 2023/08/24 09:30
- 銀行・ネットバンキング・信用金庫 ゆうちょ銀行に口座を持つ方、ゆうちょ銀行に詳しい方に聞きます。 9 2023/08/03 20:24
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DataGridViewの、選択されてい...
-
JSPのNULLレコード表示について...
-
[VBA] ADOの Clone と AddNew
-
レコードが存在しなかった場合
-
ADODBのRecordset.Deleteのエラ...
-
差し込み印刷のレコード数について
-
ファイル書込みで一行もしくは...
-
データセットのレコード更新が...
-
ACCESSで大量の更新を行うと「...
-
ADO VBA 実行時エラー3021
-
サブレンジ分割されたNDB(富士...
-
Excel VBA読み込みで文字化けが
-
カレントレコードが無い事を判...
-
サブフォームに新規レコードを...
-
ワードの差込印刷で教えて下さ...
-
DataGridViewにてセル以外をク...
-
レコードセット(ADO.Recordset)...
-
アクセスでレポートの1印刷内...
-
Access のフォームで新しい行...
-
Access を×ボタンで閉じ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードが存在しなかった場合
-
DataGridViewの、選択されてい...
-
ADO VBA 実行時エラー3021
-
差し込み印刷のレコード数について
-
ACCESSで大量の更新を行うと「...
-
ファイル書込みで一行もしくは...
-
カレントレコードが無い事を判...
-
ワードの差込印刷で教えて下さ...
-
アクセスでレポートの1印刷内...
-
DataGridViewの内容をDBに反映...
-
[VBA] ADOの Clone と AddNew
-
固有レコード識別子の選択とは
-
JSPのNULLレコード表示について...
-
Access を×ボタンで閉じ...
-
サブフォームに新規レコードを...
-
データセットのレコード更新が...
-
サブレンジ分割されたNDB(富士...
-
レコードセット(ADO.Recordset)...
-
DataGridViewにてセル以外をク...
-
COBOLでのランダムアクセス
おすすめ情報