在父行

时间:2017-09-21 06:04:29

标签: php mysql laravel-5

我有一个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(它是我用于后端的那些)。

提前致谢。

2 个答案:

答案 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解决方案

您可以直接在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

在您的查询中,我们动态地创建了两个新列:

  1. 一个名为parentTitle的新列和ORDER BY这些新列首先在列表的章节下有子章节,

  2. 并使用treeName创建另一个名为CONCAT()的列,其中包含您想要获取的所有命名法。

  3. 以下是查询:

    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'];
    }