このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/402
#  下記のようなユーザーに対する取得ポイントと、消費したポイントのテーブルがあり、 
#  それらの合計を各ユーザー毎にまとめたいのですが、どうしたらいいでしょうか? 
#   
#  [取得テーブル t1] 
#  id | user_id | point  
#  --+-------+-----  
#   1 | 1    | 30 
#   2 | 2    | 10 
#   3 | 3    | 50 
#   4 | 1    | 20 
#   5 | 2    | 10  
#   6 | 3    | 50  
#   
#  [消費テーブル t2] 
#  id | user_id | used_point  
#  --+-------+-----  
#   1 | 1    | -10 
#   2 | 2    | -10 
#   3 | 4    | -50 
#   4 | 1    | -20 
#   5 | 4    | -10  
#   
#  <欲しい結果> 
#  user_id | point  
#  -------+-----  
#   1    | 20 
#   2    | 10 
#   3    | 100 
#   4    | -60 
#   
#   
#  DBMSはMySQLです。 
#  お願いしますm(_ _)m 
# 
# 

t1(1,1,30). 
t1(2,2,10).
t1(3,3,50).
t1(4,1,20).
t1(5,2,10).
t1(6,3,50).

t2(1,1,-10). 
t2(2,2,-10).
t2(3,4,-50).
t2(4,1,-20).
t2(5,4,-10).

'下記のようなユーザーに対する取得ポイントと、消費したポイントのテーブルがあり、それらの合計を各ユーザー毎にまとめたい'(_ユーザごとの合計) :-
        ユーザを取得(L),
        findall([_user_id,_合計],(
                    append(_,[_user_id|_],L),
                    t1テーブルの合計(_user_id,_合計1),
                    t2テーブルの合計(_user_id,_合計2),
                    _合計 is _合計1 - _合計2),
                _ユーザごとの合計).

ユーザを取得(L) :-
        findsetof(_user_,t1(_user_id,_),L1),
        findsetof(_user_,t2(_user_id,_),L2),
        和集合(L1,L2,L).

t1テーブルの合計(_user_id,_合計) :-
        findsum(_point,t1(_user_id,_point),_合計).

t2テーブルの合計(_user_id,_合計) :-
        findsum(_userpoint,t2(_user_id,_userpoint),_合計).

和集合(_集合1,_集合2,_和集合) :-
        append(_集合1,_集合2,_ならび3),
        findall(_要素,(
                    append(L0,[_要素|_],_ならび3),
                    \+(append(_,[_要素|_],L0))),
                _和集合) .

%  参照
%  findsum/3 http://nojiriko.asia/prolog/findsum.html
%  findsetof/3 http://nojiriko.asia/prolog/findsetof.html