当联接表不匹配时,如何从一个表中选择所有记录?

时间:2018-09-19 02:41:39

标签: mysql

我正在制作一个简单的通知系统,但是我无法使查询正常工作,我感到困惑。

我想选择表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;

没有运气

1 个答案:

答案 0 :(得分:0)

您需要使用LEFT JOIN来联接notification_id上的表。如果t2中没有匹配值,则t2.notification_id的值将为NULL

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 Demo