このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/473
#  DBはMysql5です 
#   
#  記事 entry user_id , blog_id , title ,body  
#  ユーザー user id status  
#  友人 friend send_user_id , get_user_id(sendが自分で、getが他人) 
#   
#  があるとして  
#  user.statusが管理者の時は無条件で記事を表示  
#  それ以外は友人と、自分の記事のみ表示  
#  という状況を考えてます  
#   
#  SELECT * from ( ( entry join user on entry.user_id = user.id ) join friend on user.id = friend.get_user_id ) 
#  where user.id = "自分のID" OR user.status = "管理者" OR friend.send_user_id = "自分のID" 
#   
#  これでいけるかと思ったのですが、同じ記事が20個も30個も表示されてしまいます 
#  どのように書けばいいでしょうか?よろしくおねがいします…… 
# 
# 

'user.statusが管理者の時は無条件で記事を表示、それ以外は友人と、自分の記事のみ表示'(_id) :-
        entry(_user_id,_blog_id,_title,_body),
        user(_id,_status),
        表示(_status,_id,_user_id,_blog_id,_title,_body),
        fail.
'user.statusが管理者の時は無条件で記事を表示、それ以外は友人と、自分の記事のみ表示'(_).

表示(_id,_status,_user_id,_blog_id,_title,_body) :-
        'user.statusが管理者の時は無条件で記事を表示'(_status,_id,_user_id,_blog_id,_title,_body),!.
表示(_id,_status,_user_id,_blog_id,_title,_body) :-
        'それ以外は友人と、自分の記事のみ表示'(_status,_id,_user_id,_blog_id,_title,_body).

'user.statusが管理者の時は無条件で記事を表示'(管理者,_id,_user_id,_blog_id,_title,_body) :-
        writef('%t %t %t\n',[_user_id,_blog_id,_title,_body]).

'それ以外は友人と、自分の記事のみ表示'(_status,_id,_user_id,_blog_id,_title,_body) :-
        \+(_status = 管理者),
        友人か自分か(_id,_user_id),
        writef('%t %t %t\n',[_id,_blog_id,_title,_body]).

友人か自分か(_id,_user_id) :-
        friend(_id,_user_id).
友人か自分か(_id,_id) :- !.