このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/710
#   
#  質問です。。 
#  ・Postgresql 9 
#  ・テーブルデータはざっくりですが、以下のような感じです。 
#   
#  table_name 
#   
#    id  | state |   name    |     pride       
#  ------+-------+-----------+---------------- 
#      1 |     2 | hoge1     | 01 
#      2 |     1 | hoge2     | 02 
#     15 |     2 | hoge3     | 02,03 
#     16 |     1 | hoge4     | 02,04,05 
#     33 |     1 | hoge5     | 04 
#     34 |     1 | hoge6     | 01,05 
#     35 |     1 | hoge7     | 01,02,03 
#     36 |     1 | hoge8     | 01,02,03,04 
#   
#  実際は、もっとレコード数が多いと思っておいてください。 
#   
#  ・やりたい事 
#  ランダムに10件、とかselectして表示させたいのですが、 
#  state = 1 
#  である事が絶対条件で、 
#  なおかつ 
#  pride 
#  の、 
#  「01」が含まれるものの中から10件、ランダムに抽出 
#  「02」が含まれるものの中から10件、ランダムに抽出 
#  ・・・以下、実際のデータでは20位まで続きます。 
#   
#  ・・・といった内容を、出来るだけ簡潔に書こうと思うと、どんな方法があるでしょうか? 
#   
#  ちなみに、最終的にはidとnameを表示させるだけ、 
#  phpでWEBに表示させます。 
#   
#  SELECT id,name FROM table_name WHERE state = 1 AND pride LIKE '%01%' ORDER BY RANDOM() LIMIT 10 
#   
#  これで「01」が含まれるものの中から10件、ランダムに抽出・・・ 
#  はできるのですが、コレを20回って・・・と思いますし、 
#  SELECT id,name FROM table_name WHERE state = 1 
#  で全部出力して配列に突っ込んでからソートしなおす、 
#  というのもあまりスマートでないような気がして。。。 
#   
#  良い方法ないでしょうか。 
#   

'ランダムに10件、とかselectして表示させたいのですが、state = 1である事が絶対条件で、なおかつprideの、「01」が含まれるものの中から10件、ランダムに抽出、「02」が含まれるものの中から10件、ランダムに抽出・・・以下、実際のデータでは20位まで続きます。'(_pride_の優先順位20位までのならび,_id,_name) :-
        member(_pride,_pride_の優先順位20位までのならび),
        '10件取り出す'(_pride,_id,_name).

'10件取り出す'(_pride,_id,_name) :-
        findall([_id,_name],(
                    table_name(_id,1,_name,_pride)),
               LL_1),
        乱順処理(LL_1,_id,_name).

乱順処理(LL_1,_id,_name) :-
        length(LL_1,_要素数),
        length(Ln,10),
        乱順処理(Ln,_要素数,LL_1,LL_2),
        member([_id,_name],LL_2).

乱順処理([],_,_,[]) :- !.
乱順処理(_,0,_,[]) :- !.
乱順処理([_|Ln],_要素数,LL_1,[L|R]) :-
        乱数を使って候補節を取り出す(_要素数,LL_1,L,_残り要素数,LL_2),
        乱順処理(Ln,_残り要素数,LL_2,R).

乱数を使って候補節を取り出す(_要素数,LL_1,[_id,_name],_残り要素数,LL_2) :-
        _乱数 is random(_要素数),
        length(L0,_乱数),
        append(L0,[[_id,_name]|R0],LL_1),
        append(L0,R0,LL_2),
        _残り要素数 is _要素数 - 1.