このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/323
#  【質問テンプレ】  
#  ・DBMS名とバージョン MySQL 5.1 
#  ・テーブルデータ  
#  ・欲しい結果  
#  ・説明  
#   
#  テーブル「カート」 
#  カラム 「セッションID」「商品種別」「カートに入れた時刻」 
#   
#  テーブル「カート詳細」 
#  カラム 「セッションID」「商品コード」 
#   
#  テーブル「商品リスト」 
#  カラム「商品コード」「商品種別」 
#   
#  というテーブルがあります。 
#   
#  最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、 
#  そのセッションIDを持つレコードを「カート」「カート詳細」の両方から 
#  全て削除したいのです。 
#   
#  同じセッションIDを持つレコードは、両方のテーブルに複数あります。 
#  「注文」テーブルで「セッションID」「商品種別」の組合せはユニークで、 
#  「注文詳細」テーブルでは「セッションID」「商品コード」の組合せにユニークです。 
#   
#  結合や副問い合わせを試してみましたが、うまいこと抽出できません。 
#  SQLで書くやり方があれば教えてください。よろしくお願いします。 
# 
# 

'最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して、そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する' :-
        '最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R),
        'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID),
        R = [].

'最後にカートに入れた時刻から12時間以上経過したセッションIDを検索して'(_セッションID,R) :-
        findsetof(_セッションID,(
                    カート(_セッションID,_商品種別,_カートに入れた時刻)),
               _セッションIDならび),
        append(_,[_セッションID|R],_セッションIDならび),
        findmax(_カートに入れた時刻,(
                   カート(_セッションID,_商品種別,_カートに入れた時刻)),
                   _最後にカートに入れた時刻), 
        最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻).

'そのセッションIDを持つレコードを「カート」「カート詳細」の両方から全て削除する'(_セッションID) :-
        retractall(カート(_セッションID,_,_)),
        retractall(カート詳細(_セッションID,_)).

最後にカートに入れた時刻から12時間以上経過している(_セッションID,_最後にカートに入れた時刻) :-
        split(_最後に入れた時刻,['/',' ',':'],[_年,_月,_日,_時,_分]),
        現在の時刻(_年_1,_月_1,_日_1,_時_1,_分_1),
        '12時間後の日時'(_年,_月,_日,_時,_分,_年_2,_月_2,_日_2,_時_2,_分_2),
        [_年_1,_月_1,_日_1,_時_1,_分_1] @>= [_年_2,_月_2,_日_2,_時_2,_分_2],!.

'12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日,_時_2,_分) :-
        _時_2 is _時 + 12,
        _時_2 < 24,!.
'12時間後の日時'(_年,_月,_日,_時,_分,_年,_月,_日_2,_時_2,_分) :-
        _時_1 is _時 + 12,
        _時_2 is _時_1 - 24,
        _日_2 is _日 + 1,!.

retractall(P) :-
        retract(P),
        fail.
retractall(_).