このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1343899481/318
#  MySQL5.1 
#   
#  table1 
#  id,hoge1,hoge2 
#   
#  idが2,4,6の中で、hoge1が1,3,5のidを取得したい。 
#   
#  SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5)); 
#   
#  このsqlでidが2,4,6の3件からの検索なりますか? 
#  もっといいsqlありますか? 
# 
# 

'table1 
id,hoge1,hoge2 
 
idが2,4,6の中で、hoge1が1,3,5のidを取得したい。'(_id) :-
        テーブル検索の副目標を得る(table1,[id,hoge1],_,_副目標,_,[_id,_hoge1]),
        member(_id,[2,4,6]),
        member(_hoge1,[1,3,5]),
        _副目標.

テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :-
        テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび).
        副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!.

テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :-
        findall([_位置,_属性名],(
                    テーブル定義(_テーブル名,_位置,_属性名)),
               _テーブル定義),
        length(_テーブル定義,Len),
        length(_値ならび,Len),
        _副目標 =.. [_テーブル名|_値ならび].

副目標に鍵を設定する(_,[],_,[]).
副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :-
        member([_鍵の位置,_鍵名],_テーブル定義),
        nth1(_鍵の位置,_値ならび,_鍵の変数),
        副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4).