如何使用正确的顺序列出父类别和子类别数据

时间:2012-05-28 15:22:12

标签: php mysql

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    

因为我尝试我不能像上面那样,下面是我得到的,花&gt; <太阳花和花>香脂应该在Flower下。

Flower
Wall Decor
Stylish Living
Mug   
flower > Sun Flower
flower > Balsam
如果有人能给出一些想法或解决方案,我们非常感激。

5 个答案:

答案 0 :(得分:1)

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

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

你可能不得不修补你使用的那种JOIN(我知道应该/不应该生孩子的那种),但它会给你所有的孩子与他们的父母分类,按照你问的方式排序。 / p>

答案 1 :(得分:1)

我终于明白了你所追求的目标。这是SQL:

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      |                | 
+-----------------+----------------+

请注意,这仅适用于2级父子关系。如果你有三级并且需要在三列中显示它,那么它会变得更加复杂。

答案 2 :(得分:1)

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

...是我能想出的最好的结果。 See it working

答案 3 :(得分:0)

您很可能必须GROUP BY category_name以及排序。

这也可能对你有所帮助 http://sqllessons.com/categories.html

答案 4 :(得分:0)

这是显示列表和具有三列id,名称,父ID

的类别子列表的最佳答案
$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>";

在此代码中,我们将父ID传递给函数和函数,然后再次调用自身以显示子类别