【问题标题】:MYSQL: Create a query to display an entry's parent/hirearchy (Breadcumbs)MYSQL:创建查询以显示条目的父级/层次结构(面包屑)
【发布时间】:2014-01-18 13:56:31
【问题描述】:

我有一张这样的桌子:

--------------------Categories-------------------
| Category      | Label         | Parent        |
*************************************************
| /             | Home          | NULL          |
-------------------------------------------------
| leasing       | Leasing       | /             |
-------------------------------------------------
| leasing-steps | Leasing Steps | leasing       |
-------------------------------------------------
| new-tenant    | New Tenants   | leasing-steps |
-------------------------------------------------
| properties    | Properties    | leasing       |
-------------------------------------------------
| about         | About Us      | /             |
-------------------------------------------------

我从 PHP 收到一个变量(类别),假设值为'leasing-steps'

我需要提出一个 SQL 查询,该查询将能够采用任何类别并以正确的顺序给我它的层次结构。对于此示例 ('leasing-steps'),它必须输出以下内容:

 ---Categories---
| Category      |
*****************
| /             | 
-----------------
| leasing       |
-----------------
| leasing-steps |
-----------------

我试过这个:

SELECT `Cat1`.`Category`
FROM Categories AS `Cat1`
LEFT JOIN Categories AS `Cat2` ON `Cat1`.`Parent`
WHERE `Cat1`.`Category` = 'leasing-steps'

但它只给了我 1 个条目,而不是我想要的结果。

请注意,我正在与数量不详的父母一起工作。它可以是 1 级或 99999

【问题讨论】:

  • 这可以通过一个 php 循环来获取父/类别并使用新值查询它直到你得到所有但最好修改你的数据库模型或添加存储过程/过程.

标签: php mysql sql treeview


【解决方案1】:

问题在于您的数据库模型,如果深度始终为 3 或更少,您可以通过任务修复,但这不是一个好的解决方案。也许一个想法阅读以下关于 MySQL 中分层数据的文章:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

【讨论】:

  • 你打败了我发布那个链接,+1
  • @pakspul 阅读并不同意该解决方案。很久以前,我曾经遇到过这个问题,并且能够解决它。不幸的是,我不记得我是如何访问这些档案的。解决方案是在 SQL 本身中,而不是通过更改表。
  • @Omar - 不幸的是,您使用的是 MySQL,它更受限制。许多其他 RDBMS 具有支持此类查询的功能(通常使用递归 CTE)。您必须 1) 更改表,2) 在应用层执行此操作,3) 定义存储过程,或 4) 更改 RDBMS。
【解决方案2】:

您可以编写一个存储过程来创建一个临时表并循环遍历每个节点并插入类别,直到父节点为 NULL,然后从该临时表 ORDER 中按相反顺序选择,以便更高的节点首先出现然后删除它像这样完成后的临时表sqlFiddle

CREATE PROCEDURE get_hierchy(IN in_category varchar(50))
BEGIN
 CREATE TEMPORARY TABLE _categories(id int auto_increment primary key,category varchar(50));
 SET @category = NULL;
 SET @parent = in_category;
 WHILE(@parent IS NOT NULL) DO
    SET @nextparent = @parent;
    SET @parent = NULL;
    SELECT category,parent INTO @category,@parent FROM categories WHERE category = @nextparent;
    INSERT INTO _categories(category) values (@category);
 END WHILE;
 SELECT category FROM _categories ORDER BY id DESC;
 DROP TABLE _categories;
END//  

或者如果您的categories 表中有一个auto_incremented id,并且如果您知道层次结构中较高的节点将始终在较低的节点之前首先创建,您可以使用此查询 (sqlFiddle)

SELECT category
FROM
  (SELECT @parent:=parent as newparent,
          category,parent,
          id
   FROM categories
   JOIN(SELECT @parent:='leasing-steps')init
   WHERE category = @parent
   ORDER BY id DESC
   )cat
ORDER BY id ASC

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2015-12-13
    • 2016-01-06
    • 2021-01-08
    • 2017-03-12
    相关资源
    最近更新 更多