このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1343899481/747
#  MySQL 5.5.29 
#   
#  ┏━┳━━┳━━┓ 
#  ┃no┃.date┃名前┃ 
#  ┣━╋━━╋━━┫ 
#  ┃.1 ┃12-3┃榊  ┃ 
#  ┣━╋━━╋━━┫ 
#  ┃.2 ┃12-3┃山下┃ 
#  ┣━╋━━╋━━┫ 
#  ┃.3 ┃12-3┃斎藤┃ 
#  ┣━╋━━╋━━┫ 
#  ┃.4 ┃12-4┃山下┃ 
#  ┣━╋━━╋━━┫ 
#  ┃.5 ┃12-4┃斎藤┃ 
#  ┗━┻━━┻━━┛ 
#   
#  result: 
#  no:1 
#  名前:榊 
#   
#  このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したいと思っています。 
#  当初は2回SQLを実行しPHPで配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。 
#  宜しくお願いします。 
# 

'このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したい'(_絞込みdate,_名前) :-
        前日に名前があり(_絞込みdate,_前日に名前があり),
        当日に名前の消えている(_絞込みdate,_前日に名前があり,_当日に名前の消えている),
        データを抽出したい(_当日に名前の消えている,_名前).

前日に名前があり(_当日,_前日に名前があり) :-
        findmax(_date,(
                    テーブル(_no,_date,_),
                    _date @< _当日),
                _事実上の前日),
        setof(_名前,[_no,_事実上の前日,_名前] ^ (
                    テーブル(_no,_事実上の前日,_名前)),
                _前日に名前があり).

当日に名前の消えている(_当日,_前日に名前があり,_当日に名前の消えている) :-
        setof(_名前,[_no,_当日,_名前] ^ (
                    member(_名前,_前日に名前があり),
                    \+(テーブル(_no,_当日,_名前))),
                _当日に名前の消えている).

データを抽出したい(_当日に名前の消えている,_名前) :-
        member(_名前,_当日に名前の消えている).