人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLの質問です。

あるユーザがあるドキュメントについて既読かどうかを以下のテーブルで判断します。

<TDocument>
・id
・text

<TRead>
・id(TDocumentのid)
・userId

ユーザAが、id=1のドキュメントを閲覧すると、TReadテーブルにid=1,userId=Aのカラムが追加されます。

このとき、ユーザAにとって既読のものは
select TDocument.id
from TDocument inner join TRead on TDocument.id = TRead.id where TRead.userId = 'A'
のように抽出できますが、未読のものを抽出する場合はどうすればいいでしょうか。
もちろんユーザはA以外にもたくさんいるものとします。


●質問者: tono5652
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ON SELECT SQL カラム ドキュメント
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● KUROX
●20ポイント

SELECT id,text

FROM TDocument

WHERE NOT EXISTS

(SELECT * FROM TRead WHERE TRead.id = TDocument.ID and TRead.userId = 'A')

http://biz.rivus.jp/in_or_exists.html

◎質問者からの返答

ありがとうございます。助かりました。


2 ● freemann
●20ポイント

次のようになるかとおもいます。

SELECT id FROM TDocument

WHERE id NOT IN(SELECT id FROM TRead WHERE userId = 'A')


http://634.ayumu-baby.com/sql/sql_dml_in.html

◎質問者からの返答

ありがとうございます。助かりました。


3 ● chuken_kenkou
●40ポイント ベストアンサー

差分検索の例を、いくつか示します。

「userid='A'」の条件を外せば、すべてのユーザが未読のものだけ検索できます。



not existsを使う方法。

-- 例1
select TD.id
 from TDocument as TD
 where not exists(select * from TRead as TR
 where TD.id=TR.id
 and TR.userid='A'
        )
 order by TD.id

not inを使う方法。

-- 例2
select TD.id
 from TDocument as TD
 where TD.id not in(select id
 from TRead as TR
 where TR.userid='A')
 order by TD.id

left joinを使う方法。

-- 例3
select TD.id
 from TDocument as TD
 left join TRead as TR
 on TD.id=TR.id
 and TR.userid='A'
 where TR.id is null

http://q.hatena.ne.jp/ダミー

◎質問者からの返答

ありがとうございます。助かりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ