我如何在MySQL中组织单个表中的分层数据组?

时间:2015-07-02 15:08:19

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

我正在尝试创建一个将分层数据分组的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 < / p>

任何有关解决这个问题的建议都会非常有用和赞赏,感谢先进。

2 个答案:

答案 0 :(得分:0)

我建议你的数据库设计是错误的,这样就可以根据需要查询数据,因此可以根据需要进行格式化。

考虑三个表:

Appno   HAppno  Name    Hname   Height  Hheight weight  Hweight Createddate Hcreateddate
app1036 app1036 john    john    8   NULL    40  NULL    2015-07-02 20:14:45.590 2015-07-02 20:14:45.590 

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

答案 1 :(得分:0)

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'