このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1316769778/305
#  MySQL5です。 
#   
#  programテーブル 
#  `program_id`,`program_name` 
#   
#  titleテーブル 
#  `program_id`,`title_id`,`title` 
#   
#  dataテーブル 
#  `program_id`,`title_id`,`data_id`,`open_flag` 
#   
#  という感じで3つのテーブルがあります。 
#  ここから、data.`open_flag`が'1'の物を含む、 
#  title.`title`を、program単位でランダムに5件抽出したいと思っていますが、 
#   
#  SELECT  
#         ttl.`title` 
#        ,prg.`program_id` 
#        ,ttl.`title_id` 
#  FROM `title` AS ttl 
#  LEFT JOIN `program` AS prg ON prg.`program_id`=ttl.`program_id` 
#  LEFT JOIN `data` AS dat ON dat.`program_id`=ttl.`program_id` AND dat.`title_id`=ttl.`title_id`  
#  WHERE dat.`open_flag` = 1 
#  ORDER BY RAND() 
#  LIMIT 0,5 
#   
#  とやった場合、同じprogram_idが重複して抽出される場合が出てきてしまいます。。 
#  この場合、重複せず必ずことなる`program_id`から抽出するにはどうしたら良いでしょうか? 
#   
#   

'data.`open_flag`が 1 の物を含む、title.`title`を、program単位でランダムに5件抽出したい'(_title) :-
        program(_program_id,_program_name),
        writef('program_name = %t\n',[_program_name]),
        'titleの蒐集'(_program_id,L),
        ランダムに5件抽出したい(L,_title).

'titleの蒐集'(_program_id,L) :-
        findall(_title_id,(
                    data(_program_id,_title_id,_data_id,_open_flag),
                    _open_flag = '1',
                    title(_program_id,_title_id,_title)),
                L).

ランダムに5件抽出したい(L,_title) :-
        length(L,Len),
        ランダムに5件抽出したい(Len,[_,_,_,_,_],L,[],_5件抽出したtitle),
        member(_title,_5件抽出したtitle).

ランダムに5件抽出したい(_,[],L,_,[]).
ランダムに5件抽出したい(Len,[_|Ln],L,L1,[_title|R2]) :-
        まだ抽出していないtitleを得る(Len,L,L1,_title),
        ランダムに5件抽出したい(Len,Ln,L,[_title|L1],R2).

まだ抽出していないtitleを得る(Len,L,L1,_title) :-
        Nth is random(Len) + 1,
        nth1(Nth,L,_title),
        \+(member(_title,L1)),!.
まだ抽出していないtitleを得る(Len,L,L1,_title) :-
        まだ抽出していないtitleを得る(Len,L,L1,_title).