Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Sql 如何在左联接表中执行自联接?_Sql - Fatal编程技术网

Sql 如何在左联接表中执行自联接?

Sql 如何在左联接表中执行自联接?,sql,Sql,我有两张桌子 第一个是“blog”表: +----+--------+--------+ | id | title | status | +----+--------+--------+ | 1 | blog 1 | 1 | | 2 | blog 2 | 1 | +----+--------+--------+ 二是博客活动: 状态1是:创建 状态2:已打开 +----+---------+--------+------------+ | id | blog_id |

我有两张桌子

第一个是“blog”表:

+----+--------+--------+
| 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)
上使用索引