从树父级获取信息作为列

问题描述 投票:1回答:1

我有具有地理位置的数据。可能是城市,省,州,国家,大洲,或任何类型的位置。一个位置可以是其他位置的一部分,例如一个州是一个国家的一部分(例如美国),但是荷兰有省份。城市可以在一个省中,但不一定是一个省的一部分。部分原因是有些城市是类似城市国家的城市(例如卢森堡),但在我的情况下,如果我的位置列表中只有一个国家/地区的城市,则该城市甚至与该城市无关。

这个非常简单的例子:

| types     |
|-----------|
| Continent |
| Country   |
| Province  |
| City      |


Locations

| id | name          | type      | parent |
|----|---------------|-----------|--------|
| 1  | Europe        | Continent | NULL   |
| 2  | Netherlands   | Country   | 1      |
| 3  | Noord-Holland | Province  | 2      |
| 4  | Amsterdam     | City      | 3      |
| 5  | Haarlem       | City      | 3      |
| 6  | Luxembourg    | City      | 1      |

对于每个位置,我想知道他们的“地理父级”(如果存在)。所以预期的结果是这样的:

| id | name          | type      | Continent | Country     | Province      |
|----|---------------|-----------|-----------|-------------|---------------|
| 1  | Europe        | Continent |           |             |               |
| 2  | Netherlands   | Country   | Europe    |             |               |
| 3  | Noord-Holland | Province  | Europe    | Netherlands |               |
| 4  | Amsterdam     | City      | Europe    | Netherlands | Noord-Holland |
| 5  | Haarlem       | City      | Europe    | Netherlands | Noord-Holland |
| 6  | Luxembourg    | City      | Europe    |             |               |

如何获取所有types作为“位置”表的列?我尝试使用子查询,但是由于递归性,我完全陷入了困境:阿姆斯特丹不属于某个国家(但属于省),而卢森堡属于某个国家(不属于省)。

如何获得预期的输出?

mysql tree recursive-query
1个回答
0
投票

当然有更好的解决方案,但此刻我写了这个:

SELECT Locations.id,
       Locations.name,
       Locations.type,
       IF(l3.name IS NULL, IF(l2.name IS NULL, IFNULL(l1.name, ''), l2.name), l3.name) as Continent,
       IF(l3.name IS NULL, IF(l2.name IS NULL, '', l1.name), l2.name)                  as Country,
       IF(l3.name IS NULL, '', l1.name)                                                as Province
FROM Locations
         LEFT join Locations l1 on Locations.parent = l1.id
         LEFT join Locations l2 on l1.parent = l2.id
         LEFT join Locations l3 on l2.parent = l3.id
ORDER BY Locations.id

DEMO

© www.soinside.com 2019 - 2024. All rights reserved.