このディレクトリの索引

# 出典 :: SQL質疑応答スレ 12問目 #603 # MySQL # # テーブルデータにNo int(255)があります。 # # 現在Noには10000件のデータがあり追加や削除を繰り返しているので # 既にNo連続した数字にはなっていません。 # # 今回、取得したいのはNoが5000以上でNo小さい方から30件取得して # Noが大きい順に並べ替えて取得したいです。 # # この場合のSQLはどう書けばいいでしょうか? # # :- dynamic(テーブルデータ/1). 'Noが5000以上でNoの小さい方から30件取得してNoが大きい順に並べ替えて取得したいです。'(_No) :- 'Noが5000以上で'(_5000以上のNoならび), 'Noの小さい方から30件取得してNoが大きい順に並べ替えて'(_5000以上のNoならび,_小さい方から30件取得して大きい順に並べ替えたNoならび), 取得したい(_小さい方から30件取得して大きい順に並べ替えたNoならび,_No). 'Noが5000以上で'(_5000以上のNoならび) :- findall(_No,( 'Noが5000以上のデータを得る'(_No)),_5000以上のNoならび). 'Noが5000以上のデータを得る'(_No) :- テーブルデータ(_No), _No >= 5000. 'Noの小さい方から30件取得してNoが大きい順に並べ替えて'(_5000以上のNoならび,_小さい方から30件取得して大きい順に並べ替えたNoならび) :- 'Noの小さい方から30件取得して'(_5000以上のNoならび,L30), 'Noが大きい順に並べ替えて'(L30,_小さい方から30件取得して大きい順に並べ替えたNoならび). 'Noの小さい方から30件取得して'(_5000以上のNoならび,L30) :- 'Noの小さい方から'(_5000以上のNoならび,_小さい方から並べた5000以上のNoならび), '30件取得して'(_小さい方から並べた5000以上のNoならび,L30). 'Noの小さい方から'(_5000以上のNoならび,_小さい方から並べた5000以上のNoならび) :- msort(_5000以上のNoならび,L2). '30件取得して'(_小さい方から並べた5000以上のNoならび,L30) :- length(L30,30), append(L30,_,_小さい方から並べた5000以上のNoならび). 'Noが大きい順に並べ替えて'(L30,_小さい方から30件取得して大きい順に並べ替えたNoならび) :- reverse(L30,_小さい方から30件取得して大きい順に並べ替えたNoならび). 取得したい(_小さい方から30件取得して大きい順に並べ替えたNoならび,_No) :- member(_No,_小さい方から30件取得して大きい順に並べ替えたNoならび). テーブルデータの生成 :- length(Ln,10000), テーブルデータの生成(Ln). テーブルデータの生成([]) :- !. テーブルデータの生成(Ln) :- 'ランダムに得た数が初出の時はテーブルデータとして書き加え、既出の場合は無視する。'(Ln). 'ランダムに得た数が初出の時はテーブルデータとして書き加え、既出の場合は無視する。'(Ln) :- ランダムに得た数が(_ランダムに得た数), 初出の時はテーブルデータとして書き加えて行く(Ln,_ランダムに得た数). 'ランダムに得た数が初出の時はテーブルデータとして書き加え、既出の場合は無視する。'(Ln) :- テーブルデータの生成(Ln). ランダムに得た数が(_ランダムに得た数) :- _ランダムに得た数 is random(15000). 初出の時はテーブルデータとして書き加えて行く([_|Ln],_ランダムに得た数) :- 初出の時は(_ランダムに得た数), テーブルデータとして書き加えて行く(Ln,_ランダムに得た数). 初出の時は(_ランダムに得た数) :- \+(catch(テーブルデータ(_ランダムに得た数),E,fail)). テーブルデータとして書き加えて行く(Ln,_ランダムに得た数) :- assertz(テーブルデータ(_ランダムに得た数)), テーブルデータの生成(Ln). :- テーブルデータの生成.