Mysql 在on result中,获取多个依赖项

Mysql 在on result中,获取多个依赖项,mysql,Mysql,我有一个MySQL数据库: MySQL为了创建DB+测试值集: DROP DATABASE IF EXISTS test; CREATE DATABASE test; CREATE TABLE table_status ( Id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Status CHAR(27) NOT NULL) ENGINE=INNODB; INSERT INTO table_status (Id, Status) V

我有一个MySQL数据库:

MySQL为了创建DB+测试值集:

DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
CREATE TABLE table_status ( Id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Status CHAR(27) NOT NULL) ENGINE=INNODB;
INSERT INTO table_status (Id, Status) VALUES (1, 'CREATED'), (2, 'UNSURE'), (3, 'RUNNING'), (4, 'BEGIN_ACTION_TRUE'), (5, 'STOPPED_ACTION_TRUE_OK'), (6, 'STOPPED_ACTION_TRUE_NOT_OK'), (7, 'BEGIN_ACTION_FALSE'), (8, 'STOPPED_ACTION_FALSE_OK'), (9, 'STOPPED_ACTION_FALSE_NOT_OK'), (10, 'STOPPED_NOT_OK'), (11, 'STOPPED_OK'), (12, 'CANCEL_REQUESTED'), (13, 'CANCELLED');
CREATE TABLE table_group ( Id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Status TINYINT UNSIGNED NOT NULL DEFAULT 1, CONSTRAINT fk_group_Status FOREIGN KEY (Status) REFERENCES table_status(Id)) ENGINE=INNODB;
CREATE TABLE table_task ( Id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, IdGroup BIGINT UNSIGNED NOT NULL, Status TINYINT UNSIGNED NOT NULL DEFAULT 1, Command TEXT NOT NULL, CONSTRAINT fk_task_IdGroup FOREIGN KEY (IdGroup) REFERENCES table_group(Id) ON DELETE CASCADE, CONSTRAINT fk_task_Status FOREIGN KEY (Status) REFERENCES table_status(Id)) ENGINE=INNODB;
CREATE TABLE table_dependency ( IdBeforeTask BIGINT UNSIGNED NOT NULL, IdAfterTask BIGINT UNSIGNED NOT NULL, PRIMARY KEY (IdBeforeTask, IdAfterTask), CONSTRAINT fk_dependency_IdBeforeTask FOREIGN KEY (IdBeforeTask) REFERENCES table_task(Id) ON DELETE CASCADE, CONSTRAINT fk_dependency_IdAfterTask FOREIGN KEY (IdAfterTask) REFERENCES table_task(Id) ON DELETE CASCADE) ENGINE=INNODB;
INSERT INTO table_group (Id) VALUES (1), (2), (3), (4);
INSERT INTO table_task (IdGroup, Command) VALUES (1, "command_group_1_task_1"), (1, "command_group_1_task_2"), (1, "command_group_1_task_3"), (2, "command_group_2_task_1"), (2, "command_group_2_task_2"), (2, "command_group_2_task_3"), (3, "command_group_3_task_1"), (3, "command_group_3_task_2"), (3, "command_group_3_task_3"), (4, "command_group_4_task_1"), (4, "command_group_4_task_2"), (4, "command_group_4_task_3");
INSERT INTO table_dependency (IdBeforeTask, IdAfterTask) VALUES (1, 2), (2, 3), (4, 5), (5, 6), (7, 8), (8, 9), (10, 11), (11, 12);
表_status中的数据固定为:

INSERT INTO table_status (Id, Status) VALUES 
    (1, 'CREATED')
    (2, 'UNSURE')
    (3, 'RUNNING')
    (4, 'BEGIN_ACTION_TRUE')
    (5, 'STOPPED_ACTION_TRUE_OK')
    (6, 'STOPPED_ACTION_TRUE_NOT_OK')
    (7, 'BEGIN_ACTION_FALSE')
    (8, 'STOPPED_ACTION_FALSE_OK')
    (9, 'STOPPED_ACTION_FALSE_NOT_OK')
    (10, 'STOPPED_NOT_OK')
    (11, 'STOPPED_OK')
    (12, 'CANCEL_REQUESTED')
    (13, 'CANCELLED')
目的是要有一个包含任务的组,每个任务可以依赖于另一个任务

我想要得到的是:

组Id、任务总数、创建的任务、不确定的任务

但有一个陷阱:创建的NB_任务数定义为:状态为“已创建”且没有未解决依赖关系的任务数

未解析的依赖项定义为任务依赖于另一个具有状态的任务!=11(已停止)

如果我有这个:

table_dependency : 

IdBeforeTask    IdAfterTask
    1              2
    2              3

table_task :

Id  IdGroup     Status  Command
1     1           1     command_1
2     1           1     command_2
3     1           1     command_3
我想要

Group.Id, NB_TASK_TOTAL, NB_TASK_CREATED, NB_TASK_UNSURE
 1          3                 1                0
以下是我失败的尝试:

SELECT

G.Id,

(SELECT COUNT(T.Id) FROM table_task as T WHERE T.IdGroup = G.Id),
(SELECT COUNT(T.Status = 1) FROM table_task as T WHERE T.IdGroup = G.Id AND T.Id NOT IN (SELECT IdAfterTask from table_dependency as D1 join table_task as T1 on T1.Id=D1.IdBeforeTask WHERE T1.Status!=11)),

(SELECT COUNT(T.Status = 2) FROM table_task as T WHERE T.IdGroup = G.Id)

FROM

table_group as G
问题是我得到的是:

Group.Id, NB_TASK_TOTAL, NB_TASK_CREATED, NB_TASK_UNSURE
 1          3                 1                3
 2          3                 0                3
(我有4个组,每个组包含3个任务,所有状态为1(已创建)的任务和依赖项集,以便有刚刚“已解决”的依赖项,所以我应该有

Group.Id, NB_TASK_TOTAL, NB_TASK_CREATED, NB_TASK_UNSURE
 1          3                 1                0
 2          3                 1                0
相反


我是MySQL的初学者,我对这个请求感到迷茫。

这应该可以帮到你:

SELECT T.IdGroup as Group_Id,
       COUNT(T.IdGroup) as NB_TASK_TOTAL,
       (SELECT COUNT(Tt.Id) FROM table_task Tt WHERE Tt.IdGroup = T.IdGroup AND Tt.Status = 1) as NB_TASK_CREATED,
       (SELECT COUNT(Tt.Id) FROM table_task Tt WHERE Tt.IdGroup = T.IdGroup AND Tt.Status = 2 AND Tt.Id NOT IN (SELECT IdAfterTask from table_dependency as D1 join table_task as T1 on T1.Id=D1.IdBeforeTask WHERE T1.Status!=11)) as NB_TASK_UNSURE
  FROM table_task T
 GROUP BY T.IdGroup;

这应该可以为您做到:

SELECT T.IdGroup as Group_Id,
       COUNT(T.IdGroup) as NB_TASK_TOTAL,
       (SELECT COUNT(Tt.Id) FROM table_task Tt WHERE Tt.IdGroup = T.IdGroup AND Tt.Status = 1) as NB_TASK_CREATED,
       (SELECT COUNT(Tt.Id) FROM table_task Tt WHERE Tt.IdGroup = T.IdGroup AND Tt.Status = 2 AND Tt.Id NOT IN (SELECT IdAfterTask from table_dependency as D1 join table_task as T1 on T1.Id=D1.IdBeforeTask WHERE T1.Status!=11)) as NB_TASK_UNSURE
  FROM table_task T
 GROUP BY T.IdGroup;

cpcm\u任务
cpcm\u依赖项
包含哪些内容?您也可以提供这些内容的示例吗?…抱歉。cpcm\u任务==表任务和cpcm\u依赖项==表依赖项。我会解决这个问题。谢谢。表
cpcm\u任务
cpcm\u依赖项
包含哪些内容?您可以提供这些内容的示例吗嗯?…对不起。cpcm_任务==表_任务和cpcm_依赖==表_依赖。我修复了这个问题。谢谢。我获得了1 3 0 2 3 0 3 3 3 3 0 4 3 0不是1 3 1 0 2 1 0 3 1 0 3 1 0 4 3 1 0(我如何在这里插入回车符?).我记下了按和计数的结果。谢谢!我的大脑在最后一个小时里因为这个问题伤了我。@Tom's:很高兴它能帮上忙!我得到了13302303030430不是1310210310310310310(我怎么能在这里插入回程车厢?).我记下了一次又一次的计数,我得到了正确的结果。谢谢!我的大脑在最后一个小时里因为这个问题伤了我。@Tom's:很高兴这对我有帮助!