当连接表上没有匹配项时,如何从一个表中选择所有记录?

r7xajy2e  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(317)

我正在制作一个简单的通知系统,但我无法让我的查询工作,我感到困惑。
我想从表1中选择所有“看不见”的通知,当表2中没有匹配的结果时考虑“看不见”。

table1 t1 (notifications)
+---+-------+--------+
+id + title + content+
+---+-------+--------+
+ 1 + some..+lorem...+
+ 2 + sosf  + sfdsdf +
+ 3 +  asdf + dsfd   +
+---+-------+--------+

table2 t2 (seen notification by each user)
+-------+---------------+
+id_user+id_notification+
+-------+---------------+
+   1   +  1            +
+   1   +  3            +
+-------+---------------+

所以当t2上没有匹配的记录时,我想查询t1中的所有记录。
我试过了

SELECT t1.*
FROM t1
JOIN t2 ON t2.id_user IS NULL AND t1.id IS NULL
ORDER BY t1.id DESC;

没有运气

3bygqnnd

3bygqnnd1#

你需要使用 LEFT JOIN 加入上的表 notification_id . 其中没有匹配的值 t2 ,的值 t2.notification_idNULL :

SELECT t1.*
FROM t1
LEFT JOIN t2 ON t2.id_notification = t1.id
WHERE t2.id_notification IS NULL

输出:

id  title   content
2   sosf    sfdsdf

若要查看特定用户是否看到通知,请更改 ON 条件类似于:

LEFT JOIN t2 ON t2.id_notification = t1.id AND t2.id_user = 2

这将为您提供用户2未看到的所有通知,在本例中,所有通知都是:

id  title   content
1   some..  lorem...
2   sosf    sfdsdf
3   asdf    dsfd

sqlfiddle演示

相关问题