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以外にもたくさんいるものとします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/10/11 00:54:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント40pt

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

「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/ダミー

id:tono5652

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

2007/10/11 00:53:19

その他の回答2件)

id:KUROX No.1

回答回数3542ベストアンサー獲得回数140

ポイント20pt

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

id:tono5652

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

2007/10/11 00:53:12
id:freemann No.2

回答回数335ベストアンサー獲得回数55

ポイント20pt

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

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

id:tono5652

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

2007/10/11 00:53:15
id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54ここでベストアンサー

ポイント40pt

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

「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/ダミー

id:tono5652

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

2007/10/11 00:53:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません