我的表格联系人中有一个层次结构。每个联系人都有与表contact_state(contact_id)相关的state_id列。 contact_state表中有一个is_top列。
我需要编写2个查询: 从contact_state is_top为false的联系人中递归选择COUNT所有子项(父列为parent_id)。因此,如果孩子的state_id.contact_state为false,那么我们需要在subchild.state_id.contact_state不为true的情况下寻找他的孩子。
对于此搜索,我使用以下查询:
with recursive hierarchy as (
select contact.id
from contacts contact join contact_state state1 on contact.state_id = state1.id and contact.parent_id = 45 and state1.is_top = false
union all
select recursive_contact.id
from contacts recursive_contact
inner join contact_state recursive_contact_state on recursive_contact.state_id = recursive_contact_state.id and recursive_contact_state.is_top = false inner join hierarchy on hierarchy.id = recursive_contact.parent_id
)
select count(*) from hierarchy;
但是我完全不知道该怎么做: 选择所有具有state_id.is_top = true的孩子+(以递归方式)进入所有具有state_id.is_top = false的孩子,直到不让拥有state_id.is_top = true的孩子(仅计数他们+带有state_id.is_top =的第一层深度的孩子)真正)? 有可能吗?
如果要简单得多,可以使用以下选项: (递归地)仅检查state_id.is_top = false的所有子级,直到不让state_id.is_top = true的子级(仅计数他们+ state_id.is_top = true的一级深度子级)? 我以后可以轻松添加的一级孩子
UPD :
数据库scema:
CREATE TABLE contacts (
id INT PRIMARY KEY,
name TEXT,
parent_id INT,
state_id INT
);
CREATE TABLE contact_state (
id INT PRIMARY KEY,
name TEXT,
is_top BOOL
);
演示数据:
INSERT INTO contact_state VALUES(1, 'STATE #1', TRUE);
INSERT INTO contact_state VALUES(2, 'STATE #2', FALSE);
INSERT INTO contact_state VALUES(3, 'STATE #3', TRUE);
INSERT INTO contact_state VALUES(4, 'STATE #4', FALSE);
INSERT INTO contacts VALUES(1, 'A1', NULL, 2);
INSERT INTO contacts VALUES(2, 'A2', 1, 1);
INSERT INTO contacts VALUES(3, 'A3', 2, 2);
INSERT INTO contacts VALUES(4, 'A4', 3, 3);
INSERT INTO contacts VALUES(5, 'B2', 1, 4);
INSERT INTO contacts VALUES(6, 'B3', 5, 2);
INSERT INTO contacts VALUES(7, 'B4', 6, 1);
INSERT INTO contacts VALUES(8, 'B5', 7, 3);
INSERT INTO contacts VALUES(9, 'BB3', 5, 1);
INSERT INTO contacts VALUES(10, 'BB4', 9, 1);
INSERT INTO contacts VALUES(11, 'C2', 1, 4);
INSERT INTO contacts VALUES(12, 'C3', 11, 3);
INSERT INTO contacts VALUES(13, 'CC3', 11, 2);
INSERT INTO contacts VALUES(14, 'D2', 1, 2);
INSERT INTO contacts VALUES(15, 'E2', 1, 3);
预期输出: 5(如果使用计数)或ID:2、7、9、12、15