日期:2014-05-18  浏览次数:20426 次

|M| 想做MSDN里面的那个"你有新的消息" 在SQL中我用Not in 来查询 要是数据库大的话怎么办
如我数据库
Message --信息表
MessageID To Title ....
1 3 ..
2 3 ..
3 3 ..

MessageRead --用户读过的信息
MessageID ReadUserID
1 3
2 3
-----------------------------
字段说明 
MessageID 为信息主键
To 为接收的用户
ReadUserID 为读取该信息的用户
-----------------------------------------
然后我用SQL语句来查询出用户是否有未读信息
SELECT COUNT(MessageID) AS COUNT
FROM Message
WHERE (MessageID NOT IN
  (SELECT MessageID
  FROM MessageRead
  WHERE ReadUserID = 3)) AND [To] = 3
----------------------------------------
这样可以查询到还有一条没有读取到
但是听说Not in 的效率不是很好
如果有100W条数据的话 这个东西好像会挂掉

大家有什么好的解决方案

谢谢

------解决方案--------------------
select count(*) from Message a left join MessageRead b on a.MessageID=b.MessageID
where [To]= 3 and ReadUserID!=3

------解决方案--------------------
LZ既然說到解決方案。我就說幾句廢話。
LZ的數據庫設計沒做好,因此SQL語句再好,也無法達到最優的效率。
其實這兩個表,一個表就夠了,如下表
1. 其中Read是一個標志(Bit類型),用來表示是否已讀
2. 不需要ReadUserId字段,消息除了本人查看,還允許其他人看嗎?
Message --信息表 
MessageID Send To Title Read .... 
1 2 3 1 .. 
2 4 3 0 .. 
3 5 3 0 .. 
這樣一個數據表,可以非常輕鬆的讀出未讀消息,性能當然也是最優的
SQL code

SELECT   COUNT(*)   AS   COUNT 
FROM   Message 
WHERE   To = 3 AND  Read=0