我有一个MySQL数据库,其中的表包含如下数据:
ID | name | data | ParentId
1 | somename| 435 | 0
2 | name2 | sample| 0
3 | child | sample| 1
...
我正在尝试编写一个查询,从该表中获取所有数据并将每个子/子放在其父项之后。
示例:
1. somename | 435
1.1. child | sample
...
这可能吗?如果不是查询,我可以使用PHP(它是我用于后端的那些)。
提前致谢。
答案 0 :(得分:0)
如果您在问题中使用laravel标记。 在模型中,将关系定义为
user.php的
public function Child()
{
return $this->hasMany('App\User','ParentId');
}
public function Parent()
{
return $this->belongsTo('App\User','ParentId');
}
并在控制器中,执行
public function allUsers(){
$users = User::with('Child')->get();
return $users
}
结果将是
[{
"id": 1,
"name": "somename",
"ParentId": 0,
"child": [{
"id": 3,
"name": "child",
"ParentId": 1
}]
}, {
"id": 2,
"name": "name2",
"ParentId": 0,
"child": []
}, {
"id": 3,
"name": "child",
"ParentId": 1,
"child": []
}]
答案 1 :(得分:0)
您可以直接在MySQL查询中,这是一个为我自己使用的解决方案修改的示例。
<强> 1。按父母分类
对于按父级排序(并在您的问题中按照您的意愿在PHP / Laravel中自行分章),修改您的查询,添加以下IF
语句并修改ORDER BY
:
SELECT
T1.*,
IF(T1.`parentId` > 0,
(SELECT `name` FROM `table` T2 WHERE T2.`ID` = T1.`parentId`),
T1.`title`
) AS `parentName`,
FROM `table` T1
ORDER BY `parentName` ASC, `name` ASC
<强> 2。章节(高级用途)
如果你想直接在MySQL中进行分章,那么它是可能的。我想到了这一点并为您提供了一个高级查询。
首先,使用ID
不是一个好主意,因为这个是唯一的,例如对于第3章。你不能再开始 3.1,3.2 ,... 用于子章节。
MySQL表格
因此,让我们在您的表格中创建一个名为sorting
的新列(它的章节编号和子章节编号):
ID | name | data | ParentId | sorting
1 | somename| 435 | 0 | 1
2 | name2 | sample| 0 | 2
3 | child | sample| 1 | 1
<强> SQL 强>
在您的查询中,我们动态地创建了两个新列:
一个名为parentTitle
的新列和ORDER BY
这些新列首先在列表的章节下有子章节,
并使用treeName
创建另一个名为CONCAT()
的列,其中包含您想要获取的所有命名法。
以下是查询:
SELECT
T1.*,
IF(T1.`parentId` > 0,
(SELECT `name` FROM `table` T2 WHERE T2.`ID` = T1.`parentId`),
T1.`title`
) AS `parentName`,
IF(T1.`parentId` > 0,
CONCAT((SELECT `sorting` FROM `table` T3 WHERE T3.`ID` = T1.`parentId`), '.', T1.`sorting`, '. ', T1.`title`),
CONCAT(T1.`sorting`, '. ', T1.`title`)
) AS `treeName`
FROM `table` T1
GROUP BY T1.`ID`
ORDER BY
`parentName` ASC,
`sorting` ASC
PHP
之后,您只需显示如下列表:
foreach($data as $row) {
echo $row['treeName'];
}