Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在联合查询中为未读通知创建列_Mysql_Sql_Mariadb - Fatal编程技术网

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的性能更好。