あるユーザがあるドキュメントについて既読かどうかを以下のテーブルで判断します。
<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以外にもたくさんいるものとします。
差分検索の例を、いくつか示します。
「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
SELECT id,text
FROM TDocument
WHERE NOT EXISTS
(SELECT * FROM TRead WHERE TRead.id = TDocument.ID and TRead.userId = 'A')
ありがとうございます。助かりました。
次のようになるかとおもいます。
SELECT id FROM TDocument
WHERE id NOT IN(SELECT id FROM TRead WHERE userId = 'A')
ありがとうございます。助かりました。
差分検索の例を、いくつか示します。
「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
ありがとうございます。助かりました。
ありがとうございます。助かりました。