Mysql 在联合查询中为未读通知创建列
我试图区分两个联合选择。 我有两个表:通知和读取通知 通知表:Mysql 在联合查询中为未读通知创建列,mysql,sql,mariadb,Mysql,Sql,Mariadb,我试图区分两个联合选择。 我有两个表:通知和读取通知 通知表: id title body ----------------- id user_id notification_id ---------------------------- 读取通知表: id title body ----------------- id user_id notification_id ---------------------------- 我已经成功地获得了未读和阅读通知,如下
id title body
-----------------
id user_id notification_id
----------------------------
读取通知表:
id title body
-----------------
id user_id notification_id
----------------------------
我已经成功地获得了未读和阅读通知,如下所示:
SELECT id,
title_ru
FROM notification
WHERE id NOT IN (SELECT notification_id
FROM read_notification
WHERE user_id = 1)
UNION
SELECT id,
title_ru
FROM notification
WHERE id IN (SELECT notification_id
FROM read_notification
WHERE user_id = 1)
并得到未读通知先出现后读取的结果:
id title
----------
2 title2
3 title3
4 title4
1 title1
现在我需要区分它们,所以我需要一个read列,其中未读通知将标记为1。
应该是这样的:
id title read
-----------------
2 title2 1
3 title3 1
4 title4 1
1 title1 0
无法理解如何形成它。将其作为文本添加到
选择列表中
SELECT id,
title_ru,
0 AS isread
FROM notification
WHERE id NOT IN (SELECT notification_id
FROM read_notification
WHERE user_id = 1)
UNION
SELECT id,
title_ru,
1 AS isread
FROM notification
WHERE id IN (SELECT notification_id
FROM read_notification
WHERE user_id = 1)
您也可以通过使用左连接,在不使用联合的情况下执行此操作
SELECT id, title_ru, IF(r.notification_id IS NULL, 0, 1) AS isread
FROM notification AS n
LEFT JOIN read_notification AS r ON n.id = r.notification_id AND r.user_id = 1
或者使用相关子查询
SELECT id,
title_ru,
EXISTS (
SELECT 1 FROM read_notifications as r
WHERE r.notification_id = n.id
AND r.user_id = 1) AS isread
FROM notification AS n
我以前试过你的第一个版本。但在读取附近出错。然后我发现read是一个保留字。在这里,我认为第1个版本是最简单的版本。从性能/速度的角度来看,它更好,不是吗?MySQL因执行WHERE x IN(子查询)
差而臭名昭著,所以我尽量避免它。我通常发现join的性能更好。