このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/591
#  ・RDBMS 
#  MySQL 5.1.6 
#   
#  ・テーブルデータ 
#  aji_table   //調味料テーブル 
#  rank int(3) //表示順位 NULL許可 
#  name varchar(16) //調味料の品名 
#  price int(5) //調味料の値段 
#   
#  ・インサートされているデータ 
#  NULL|さとう  |100  
#  0   |しお   |200  
#  3   |こしょう |300  
#  NULL|みそ   |400  
#  NULL|みりん  |500  
#   
#  ・欲しい結果 
#  0   |しお   |200 
#  NULL|さとう  |100 
#  NULL|みそ   |400  
#  3   |こしょう |300  
#  NULL|みりん  |500  
#   
#   
#  ・説明 
#  お世話になります。 
#  上記にある調味料値段データベースにおいて 
#  表示順をソートする際に 
#  ・順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に出す。 
#  ・それ以外は、値段昇順で出力する。 
#   
#  というSELECT文が組めないものかと思っております。 
#   
#  単純に値段順で表示したいんですけど、いくつかの商品は 
#  表示結果におけるその順番の位置を固定したい!という内容でして 
#  順位のフィールドをおいてなんとか解決しようとしているのですがうまく組めません。 
#   
#  対応策を是非、ご教授頂ければと思います。 
#   
#  なお、そんなテーブルの組み方はダメだ、そういうときはこう組め!等もありましたら 
#  ご教授お願いいたします。 
#   
#   
#  よろしくお願いいたします。 
# 
# 

'順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に、それ以外は、値段昇順で出力する。 単純に値段順で表示したいんですけど、いくつかの商品は表示結果におけるその順番の位置を固定したい'(_表示行) :-
        '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に'(_表示位置固定ならび),        
        'それ以外は、値段昇順で'(_表示位置自由ならび),
        二つのならびを併合する(0,_表示位置固定ならび,_表示位置自由ならび,_表示ならび),
        member(_表示行,_表示ならび).

'順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に'(_表示位置固定ならび) :-
        findall([_表示位置,_調味料の値段,_調味料の品名],(
                    調味料テーブル(_表示位置,_調味料の品名,_調味料の値段),
                    _表示位置>=0),
                _表示位置固定ならび).

'それ以外は、値段昇順で'(_表示位置自由ならび) :-
        findall([_調味料の値段,_調味料の品名,_表示位置],(
                    調味料テーブル(_表示位置,_調味料の品名,_調味料の値段),
                    \+(_表示位置>=0)),
                _鍵順に並べ直した表示位置自由ならび),
        sort(_鍵順に並べ直した表示位置自由ならび,_整列した表示位置自由ならび),
        フィールド順を元に戻す(_整列した表示位置自由ならび,_表示位置自由ならび).

二つのならびを併合する(_,L1,[],L1).
二つのならびを併合する(_,[],L2,L2).
二つのならびを併合する(N,[[N,_調味料の品名,_調味料の値段]|R1],L2,[[N,_調味料の品名,_調味料の値段]|R3]) :-
        N_2 is N + 1,
        二つのならびを併合する(N_2,R1,L2,R3),!.
二つのならびを併合する(N,L1,[[_表示位置,_調味料の品名,_調味料の値段]|R2],[[_表示位置,_調味料の品名,_調味料の値段]|R3]) :-
        N_2 is N + 1,
        二つのならびを併合する(N_2,R1,L2,R3).

フィールド順を元に戻す([],[]).
フィールド順を元に戻す([[_調味料の値段,_調味料の品名,_表示位置]|R1],[[_表示位置,_調味料の品名,_調味料の値段]|R2]) :-
        フィールド順を元に戻す(R1,R2).