T3中的T1 WHERE ID中的Mysql SELECT不存在于T3中

时间:2014-02-05 03:53:24

标签: php mysql multiple-tables

好的,所以这可能听起来很复杂,让我解释一下......我一直在敲打这个问题一段时间,现在我陷入困境......无法理解!< / 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就会建立起来。我觉得,我真是太近了......

很简单,现在该怎么做?我不会发布什么不起作用......

请帮忙......

2 个答案:

答案 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