このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/627
#  mysql 5.0 (windows 7)です 
#  下記のようなテーブルで 
#  amountの合計の最も多いidを取得するsql文がわかりません… 
#   
#  select id, sum(amount) as "total" from orders 
#  group by id order by total desc limit 1; 
#   
#  とすれば一応取得できたのですが、別の方法はないでしょうか 
#  初歩的な質問ですみません… 
#   
#  +------+------+--------+ 
#  | id   | name | amount | 
#  +------+------+--------+ 
#  |  1   | C1   |      3 | 
#  |  1   | C2   |     10 | 
#  |  2   | C2   |      5 | 
#  |  2   | C3   |     10 | 
#  |  3   | C3   |      2 | 
#  +------+------+--------+ 
# 

'amountの合計の最も多いidを取得する'(_最もaumout合計が多いid) :-
        find_sum_max([_id,_値],orders(_id,_,_値),[_最もamount合計が多いid,_最大合計値]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% _合計値 は任意の変数として、利用者が設定する

find_sum_max([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最大合計値]) :-
        findall([_鍵,_値],(
                    単一(_鍵,P)),
                    findsum(_値,P,_合計値)),
                L),
        findmax(_合計値,(
                    append(_,[[_鍵,_合計値]|_],L),
                    _合計値の条件),
                _最大合計値),
        append(_,[[_鍵,_最大合計値]|_],L).

find_sum_min([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最小合計値]) :-
        findall([_鍵,_値],(
                    単一(_鍵,P)),
                    findsum(_値,P,_合計値)),
                L),
        findmin(_合計値,(
                    append(_,[[_鍵,_合計値]|_],L),
                    _合計値の条件),
                _最小合計値),
        append(_,[[_鍵,_最小合計値]|_],L).

find_sum_max([_鍵,_値],P,[_鍵,_最大合計値]) :-
        findall([_鍵,_値],(
                    単一(_鍵,P)),
                    findsum(_値,P,_合計値)),
                L),
        findmax(_合計値,append(_,[[_鍵,_合計値]|_],L),_最大合計値),
        append(_,[[_鍵,_最大合計値]|_],L).

find_sum_min([_鍵,_値],P,[_鍵,_最小合計値]) :-
        findall([_鍵,_値],(
                    単一(_鍵,P)),
                    findsum(_値,P,_合計値)),
                L),
        findmin(_合計値,append(_,[[_鍵,_合計値]|_],L),_最小合計値),
        append(_,[[_鍵,_最小合計値]|_],L).

単一(A,P) :-
        findsetof(A,P,L),!,
        append(_,[A|_],L).