Sql 如何在左联接表中执行自联接?
我有两张桌子 第一个是“blog”表:Sql 如何在左联接表中执行自联接?,sql,Sql,我有两张桌子 第一个是“blog”表: +----+--------+--------+ | id | title | status | +----+--------+--------+ | 1 | blog 1 | 1 | | 2 | blog 2 | 1 | +----+--------+--------+ 二是博客活动: 状态1是:创建 状态2:已打开 +----+---------+--------+------------+ | id | blog_id |
+----+--------+--------+
| id | title | status |
+----+--------+--------+
| 1 | blog 1 | 1 |
| 2 | blog 2 | 1 |
+----+--------+--------+
二是博客活动:
状态1是:创建
状态2:已打开
+----+---------+--------+------------+
| id | blog_id | status | date |
+----+---------+--------+------------+
| 1 | 1 | 1 | 2019-09-09 |
| 2 | 2 | 1 | 2019-09-10 |
| 2 | 2 | 2 | 2019-09-11 |
+----+---------+--------+------------+
我想记录的博客没有打开的所有细节的博客表
例如:
+----+---------+--------+------------+--------------------+
| id | blog_id | title | blog.date | blog_activity.date |
+----+---------+--------+------------+--------------------+
| 1 | 1 | blog 1 | 2019-09-09 | 2019-09-09 |
+----+---------+--------+------------+--------------------+
一种方法使用聚合:
SELECT
ba.id,
ba.blog_id,
b.title,
ba.date
FROM blog b
INNER JOIN blog_activity ba
ON b.id = ba.blog_id
INNER JOIN
(
SELECT blog_id
FROM blog_activity
GROUP BY blog_id
HAVING COUNT(CASE WHEN status = 2 THEN 1 END) = 0
) t
ON b.id = t.blog_id;
别名为
t
的子查询将查找所有未关联打开状态的博客。在这种情况下,只有blog\u id=1
符合此条件。我想我会使用存在
和加入
:
select b.*, ba.date as created_date
from blog b join
blog_activity ba
on ba.blog_id = b.id and ba.status = 1
where not exists (select 1
from block_activity ba2
where ba2.blog_id = b.id and ba2.status = 2
);
这避免了聚合,它可以在blog\u活动(blog\u id,status)
上使用索引