棘手的mysql加入

时间:2012-01-23 17:30:08

标签: mysql join

我对sql查询有点困惑。我到处搜索但无济于事,所以希望有人在这里帮忙。

我有2张桌子。

表1是包含以下列的通知列表

  • notification_id(这是自动递增的主键)
  • notification(这是通知消息)
  • from_id(这是发送通知的人的user_id)

例如

|  notification_id  |  notification  |  from_id  |
|       25          |  this message  |    7      |
|       26          |  that message  |    8      |

表2显示了哪些用户已阅读每个通知。它有以下列

  • notification_id(这是相关通知的ID)
  • user_id(这是阅读通知的人的用户ID)

例如

| notification_id   |   user_id   |
|     25            |      1      |
|     25            |      2      |
|     25            |      3      |
|     26            |      2      |

这些表在notification_id上加入,我们有一对多关系,因为很多用户会阅读每个通知。

我要做的是查询数据库以返回特定用户尚未阅读的所有通知。换句话说,我希望表1中的数据,但仅当表2没有相应user_id的user_id(我的notification_id x)的条目时。

因此,如果我的user_id为4,那么我会得到notification_id 25和26的数据,因为user_id 4未列在表2中

如果我的user_id为2,则表示user_id中没有任何数据,表2列出了notification_id 25和26

如果我的user_id为1,我会获得notification_id 26但不是25

的数据

我原本以为我可以用这个

SELECT
    notification_id, notification, from_id 
FROM table_1 
INNER JOIN table 2 
    ON table_1.notification_id = table2.notification_id
WHERE table2.user_id != X

但这实际上离我需要的还有很长的路要走,我已经走到了一个死胡同。

由于

3 个答案:

答案 0 :(得分:2)

我会做一个左连接并寻找空连接。

SELECT notification_id, notification, from_id FROM table_1
LEFT JOIN table_2 ON table_2.notification_id = table_1.notification_id AND table_2.user_id = x
WHERE table_2.notification_id IS NULL

答案 1 :(得分:0)

SELECT
    notification_id, notification, from_id 
FROM table_1 
WHERE 
    notification_id NOT IN (SELECT notification_id from table_2 WHERE user_id = X)

答案 2 :(得分:0)

首先搜索用户获得的所有通知,然后搜索所有其他通知

SELECT
    notification_id, notification, from_id 
FROM table_1 
WHERE notification_id not in 
     (SELECT notification_id
      FROM  table 2   
      WHERE table2.user_id == X)