DataRow match = myData.AsEnumerable().FirstOrDefault(x => x["ID"] == textBox1.Text);
if (match != null)
//Here's your row
else
//No match found
如果我有一个ID,并且想获取其子代,则可以运行以下查询:
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| subject | int(11) | YES | | NULL | |
| relationship | varchar(266) | YES | | NULL | |
| target | int(11) | YES | | NULL | |
+--------------+--------------+------+-----+---------+-------+
这将使我的所有孩子都受益于“ is_a”关系。然后,我想找到所有这些孩子的孩子。我要继续下去,直到没有更多的孩子为止。最后,我想要一个源于我的原始根ID的子ID列表。
是否有一种有效的方法来做到这一点?我尝试使用python脚本以递归方式在上面运行该查询,并且需要几分钟才能生成约100个结果。
注意:一个孩子可能有多个父母
答案 0 :(得分:0)
将树结构存储在关系数据库中的一种聪明方法是使用嵌套集。
假设我们有以下树:
1
/ \
2 3
/ /\
4 5 6
我们有一个传统的parent_id:
| id | parent_id |
|----+-----------|
| 1 | 0 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 3 |
| 6 | 3 |
在此模型中,您没有机会,而是递归获取某个节点的所有后代。
现在,我们为每个节点添加2个数字:左右。
左边的数字小于节点的所有子代的数目,而右边的数字大于节点的所有子代的数目。
我将这些数字放在方括号中
(1) 1 (12)
/ \
(2) 2 (5) (6) 3 (11)
/ / \
(3) 4 (4) (7) 5 (8) (9) 6 (10)
然后我们得到下表:
| id | parent_id | left | right |
|----+-----------+------+-------|
| 1 | 0 | 1 | 12 |
| 2 | 1 | 2 | 5 |
| 3 | 1 | 6 | 11 |
| 4 | 2 | 3 | 4 |
| 5 | 3 | 7 | 8 |
| 6 | 3 | 9 | 10 |
现在,您可以使用2个查询来获取节点的所有子节点:首先,您将节点向左移,将节点向右移,然后:
SELECT
id
FROM
tbl
WHERE
`left` > $node_left
AND
`right` < $node_left
这种方法要求您在修改树的结构时重新计算左右。