好的,所以这可能听起来很复杂,让我解释一下......我一直在敲打这个问题一段时间,现在我陷入困境......无法理解!< / p>
T1是一个简单的警报数据表。它有这些标题:
| ID | TITLE | DATA |
---------------------------------
| 1 | Title1 | Text1 |
| 2 | Title2 | Text2 |
T2,只是一个简单的用户表
| ID | Name |
-------------------
| 1 | Fred |
| 2 | Bill |
| 3 | Brad |
T3是T1和T2之间的链接表。基本上,当用户(T2.ID)第一次查看他未查看的警报(T1.ID)时,他的ID被添加到此表中,因此我知道他已经查看过它。
| ID | T1ID | T2ID |
--------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 2 |
| 5 | 2 | 3 |
| 6 | 3 | 1 |
| 7 | 3 | 3 |
我可以告诉用户1没有查看过警报2,也没有用户2查看过警报3.所以下次登录时,我应该向他们弹出这些警报...所以如果我是用户1,当我登录我的管理员时网站,我希望MySQL告诉我,我没有查看过警报2,然后在我这样做时更新该表。
正如我所说,每当用户查看其ID与警报ID不匹配的警报时,T3就会建立起来。我觉得,我真是太近了......
很简单,现在该怎么做?我不会发布什么不起作用......
请帮忙......
答案 0 :(得分:0)
尝试:
Select * from t1 where id not in (select t3.t1id from t3 where t3.t2id = <loggedin userid>)
答案 1 :(得分:0)
首先,您要从警报表开始,因为它适用于所有人。从那里开始,对已经查看的表进行LEFT-JOIN专门针对有问题的登录用户ID,并且警报ID是相同的。
where子句仅查找那些在查看警报时找不到相应登录用户ID的条目。对于那些,获取警报的标题和数据。 之后,向用户显示,您可以在查看警报后插入。
我会确保已查看的表在两个键上都有索引(T1ID,T2ID)以帮助优化连接
SELECT
T1.Title,
T1.Data
from
YourAlertTable T1
LEFT JOIN AlreadyViewedTable T3
ON T3.T2ID = TheUserIDParameterWhoLoggedIn
AND T1.ID = T3.T1ID
where
T3.T2ID IS NULL