Php 如何以适当的顺序列出父类别和子类别数据

Php 如何以适当的顺序列出父类别和子类别数据,php,mysql,Php,Mysql,我试着先列出排序顺序为父类别的数据,然后列出子类别的数据 table : category | id + category_name + parent_category_id | | 1 | Flower | 0 | | 2 | Wall Decor | 0 | | 3 | Stylish Living| 0 | | 4 |

我试着先列出排序顺序为父类别的数据,然后列出子类别的数据

table : category  
    | id + category_name + parent_category_id |
    | 1  | Flower        |          0         |
    | 2  | Wall Decor    |          0         |
    | 3  | Stylish Living|          0         |
    | 4  | Mug           |          0         |
    | 5  | Sun Flower    |          1         |
    | 6  | Balsam        |          1         |
当我尝试时,我不能像上面那样得到,下面是我得到的,花>太阳花和花>香脂应该在花下

Flower
flower > Sun Flower
flower > Balsam
Wall Decor
Stylish Living
Mug    

如果有人能给出一些想法或解决方案,我会非常感激。

您很可能需要按类别(名称)分组以及排序

这也可能对你有很大帮助

我有一个类似的结构,并使用此结构的一个变体:

Flower
Wall Decor
Stylish Living
Mug   
flower > Sun Flower
flower > Balsam

您可能需要修改您使用的加入类型(我知道什么应该/不应该有孩子),但它将为您提供与家长一起的所有孩子类别,并按照您要求的方式进行排序。

我终于获得了它,以准确显示您想要的内容。下面是SQL:

SELECT
    p.category_id, p.category_name,
    c.category_id, c.category_name
FROM category AS c
JOIN category AS p ON (c.parent_category_id = p.category_id)    
ORDER BY p.category_name, c.category_name
以下是输出:

SELECT p.category_name as parent_category, '' as child_category
FROM category AS p
WHERE parent_category_id not in (select category_id from category)
UNION
SELECT p.category_name as parent_category, c.category_name as child_category
FROM category AS p
JOIN category AS c ON (c.parent_category_id = p.category_id)
ORDER BY parent_category, child_category
请注意,这只适用于两级父子关系。如果您有第三个级别,并且需要在三列中显示它,那么它会变得更加复杂

+-----------------+----------------+
| parent_category | child_category |
+-----------------+----------------+
| Flower          |                | 
| Flower          | Balsam         | 
| Flower          | Sun Flower     | 
| Mug             |                | 
| Stylish Living  |                | 
| Wall Decor      |                | 
+-----------------+----------------+

…是我能为您提供的最好结果

这是显示具有三列id、名称、父id的类别列表和子列表的最佳答案

SELECT category
FROM (
  SELECT
     IF(p.category_name is null, c.category_name, CONCAT(p.category_name, ' > ', c.category_name)) AS 'category'
  FROM category c
  LEFT JOIN category p ON c.parent_category_id = p.category_id
) s
ORDER BY category
$con=mysqli_connect(“localhost”、“root”、“test”);
$sql=“从父级为0的类别中选择*”;
$result=mysqli\u查询($con,$sql);
回声“;
while($row=mysqli\u fetch\u数组($result))
{
回显“
  • ”$row['name']。“
  • ”; abc($row['id']); } 功能abc($id) { 全球$con; $sql=“从父项为$id的类别中选择*”; $result=mysqli\u查询($con,$sql); 回声“; while($row=mysqli\u fetch\u数组($result)) { 回显“
  • ”$row['name']。“
  • ”; abc($row['id']); } 回声“; } 回声“;

    在这段代码中,我们将父id传递给function,然后function再次调用自身以显示子类别

    您可以显示您的查询吗?请显示不起作用的现有查询。我很确定您需要使用
    左联接
    ,由于父母没有他们自己的父母,并且在加入过程中会被过滤掉,毫无疑问,使用WHERE's和JOINs变量进行过滤是正确的。我从我的代码中复制的代码片段比这个要广泛得多,所以从一开始就尽量简化它。@ruslyrossi是连接函数,它只是将字符串连接在一起。就像PHP中的“字符串1”、“字符串2”。
    $con=mysqli_connect("localhost","root","","test");
    $sql="select * from category where parent=0";
    $result=mysqli_query($con,$sql);
    echo "<ol>";
    while($row=mysqli_fetch_array($result))
    {
        echo "<li >".$row['name']."</li>";
        abc($row['id']);
    }
    
    function abc($id)
    {
        global $con;
        $sql="select * from category where parent=$id";
        $result=mysqli_query($con,$sql);
        echo "<ol>";
        while($row=mysqli_fetch_array($result))
        {
            echo "<li>".$row['name']."</li>";
            abc($row['id']);
        }
        echo "</ol>";
    }
    echo "</ol>";