我对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
但这实际上离我需要的还有很长的路要走,我已经走到了一个死胡同。
由于
答案 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)