【问题标题】:How do I in MySQL organize groups of hierarchical data from a single table?我如何在 MySQL 中从单个表中组织分层数据组?
【发布时间】:2015-07-02 15:08:18
【问题描述】:

我正在尝试创建一个对分层数据进行分组的 MySQL 查询。这是一个数据库的例子

table name: location
locationID INT UNSIGNED NOT NULL AUTO_INCREMENT,
parentID INT UNSIGNED NOT NULL,
name CHAR(255)

这是一些示例数据

 locationID    parentID     name
 1      |     0     |   United States
 2      |     1     |   Massachusetts
 3      |     2     |   Boston
 4      |     2     |   Worcester
 5      |     1     |   New York
 6      |     5     |   Brooklyn
 7      |     1     |   Colorado
 8      |     7     |   Denver
 9      |     0     |   Canada
 10     |     9     |   Ontario
 11     |     10    |   Toronto
 12     |     9     |   Quebec
 13     |     12    |   Quebec City

以上名称只是用于了解我希望如何处理查询的示例。 我希望以特定的方式显示上表数据。 我希望按名称升序(国家)对 parentID = 0 的行进行排序,并在每个行下列出 parentID 与 locationID 匹配的行(州/省),并在每一行下列出 parentID 与 locationID 匹配的行(城市)。

这是我迄今为止尝试过的,但无济于事。

SELECT locationID,parentID,name FROM location ORDER BY parentID ASC name ASC

还有

SELECT locationID,parentID,name FROM location GROUP BY 'parentID' ORDER BY name ASC

我希望能够添加行并选择父级并生成一个列表,其中父级在顶部,然后是子级,然后是每个子级下面的子级,等等。我正在使用 MySQL 和 PHP 进行编程

任何有关解决此问题的建议都将非常有帮助和赞赏,在此先感谢。

【问题讨论】:

  • 使用别名自行加入事物。并不是说这可能完全清楚;)
  • 你希望这完全在 mysql 中完成?还是 PHP 和 mysql?
  • 最好在 MySQL 中,但如果 PHP 是必要的/更安全或更快,那么我猜两者都是。
  • 所以我成功地设计了一个我想要的 PHP 版本,但是它在 WHILE 循环中使用了许多查询。效率不是很高,也不是我想要的那么快

标签: php mysql sql-order-by hierarchical-data


【解决方案1】:
create table location
(
    id int auto_increment primary key,
    parentId int not null, -- avoid nulls, 0 is top-level
    place varchar(100) not null
);

insert location(parentId,place) values (0,'Canada'),(0,'Mass'),(0,'Jersey');

insert location(parentId,place) values (2,'Boston'),(2,'Newton'),(2,'Woods Hole');

insert location(parentId,place) values (5,'Chestnut Hill');

insert location(parentId,place) values (3,'Montclair'),(3,'Secaucus');


-- get first level children
select t1.*,t2.*
from location t1
join location t2
on t2.parentId=t1.id and t1.place='Mass'

【讨论】:

    【解决方案2】:

    我建议您的数据库设计是错误的,因此很难根据需要查询数据以便可以根据需要对其进行格式化。

    考虑三个表:

    Country with columns:- name,country_ID
    State with columns:- name, state ID, country ID
    City with columns:- name, city_ID (maybe not needed) state_ID.
    

    通过这种设计,查询几乎可以与您对话。

    【讨论】:

    • “不灵活设计”是什么意思?
    • 如果需要新的层次结构,例如国家、地区、省、邻里、街道……那么您需要重新架构并更改源代码。而不是简单地重新调整父数据。更不用说你造成的混乱和糟糕的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多