このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/417
#  MySQL Ver5以降で質問です。 
#   
#  まずテーブルの説明をします。 
#  user_dataテーブル user_id, level 
#  friendテーブル user_id, friend_user_id 
#  という2つのテーブルがあります。 
#   
#  friendテーブルは 1, 2 というレコードであれば 
#  「user_id=2は、user_id=1の友達である」 
#  という意味となり、必ずそれぞれを入れ替えた「2, 1」というレコードも存在します。 
#   
#  user_dataテーブルから 
#  「levelが4で、かつあなたの友人ではないユーザーのレコードを全て取得する」 
#  ということをやりたいのですが、可能でしょうか。 
#   
#  「levelが4で、かつあなたの友人『である』ユーザー〜」であれば(あなたのIDは1とします) 
#  SELECT * FROM user_data INNER JOIN friend ON user_data.user_id = friend.user_id AND 1 = friend.friend_user_id; 
#  でOKかと思います。 
#  この逆がやりたいのですが… 
#   
#  サブクエリーを使って、NOT IN を使うなどすれば不可能では無さそうですが、1の友達が1000人くらいいるときつそうです。 
#   
# 
# 

lebelを指定してあなたの友人でない人の全ての情報を取得する(_あなた,_leble,_友人でない人の情報ならび) :-
        findall([_user_id,_lebel,_友人ならび],(
                    user_dataテーブル(_user_id,_lebel),
                    \+(friendテーブル(_あなた,_user_id),
                    findall(_freind_user_id,friendテーブル(_user_id,_freind_user_id),_友人ならび)),
                _友人でない人の情報ならび).