我有一个MySQL表,如下所示:
id | name | parent_id
19 | category1 | 0
20 | category2 | 19
21 | category3 | 20
22 | category4 | 21
......
Run Code Online (Sandbox Code Playgroud)
现在,我想要一个MySQL查询,我只提供id [例如说'id = 19']然后我应该得到它的所有子id [即结果应该有id',21,22']. ...而且,孩子们的等级不知道它可以变化....
另外,我已经有了使用for循环的解决方案.....如果可能的话,让我知道如何使用单个MySQL查询来实现相同的功能.
我看到了这个答案,我希望他是不正确的,就像有人不正确地说主键在列上而我无法在多列上设置它.
这是我的桌子
create table Users(id INT primary key AUTO_INCREMENT,
parent INT,
name TEXT NOT NULL,
FOREIGN KEY(parent)
REFERENCES Users(id)
);
+----+--------+---------+
| id | parent | name |
+----+--------+---------+
| 1 | NULL | root |
| 2 | 1 | one |
| 3 | 1 | 1down |
| 4 | 2 | one_a |
| 5 | 4 | one_a_b |
+----+--------+---------+
Run Code Online (Sandbox Code Playgroud)
我想选择用户ID 2并递归,所以我得到了所有直接和间接的孩子(所以id 4和5).
如何以这样的方式编写它?我在postgresql和sqlserver中看到了递归.
所以我的数据结构如下:
id|parent_id|name
1 |null |foo
2 |1 |bar
3 |2 |baz
Run Code Online (Sandbox Code Playgroud)
所以基本上foo->bar->baz.我很难理解如何使用laravel的查询构建器来获取子行的行,然后是它的祖先(直到parent_id == null).这可以用laravel完成吗?我已经完成了一些研究,Postgres RECURSIVE虽然MySQL没有(Postgres递归查询在遍历parent_id时更新字段的值).
我相信MySQL有类似的东西:如何在MySQL中进行递归SELECT查询?
但是我如何在Laravel中实现这个呢?
我的开始代码基本上是使用查询范围,但我只是没有做到正确:
Model::select('name')->getParent(3); //get baz and the ancestors of baz
protected function scopeGetParent($id) {
$parent = Model::where('id', '=', $id);
return $query->getParent($parent->parent_id);
}
Run Code Online (Sandbox Code Playgroud)
我想要的结果是:
name
baz
bar
foo
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个表格如下
TaskID ParentTaskID
1 1
2 1
3 2
4 2
5 2
10 10
11 11
12 11
13 0
14 14
Run Code Online (Sandbox Code Playgroud)
如果taskid为1,我想得到如下结果
TaskID
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
如果是2那么
Taskid
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
如果它10然后10
意味着我想选择具有taskid = 1的行,其行具有parenttaskid = 1,其中行具有上述选择中的parenttaskid等等........