【问题标题】:MySQL query to select cities under any region givenMySQL查询以选择给定区域下的城市
【发布时间】:2015-09-09 17:03:22
【问题描述】:

我有一个包含所有区域的数据库,包括城市,它们以树状结构排列,使用每个 id 作为父区域 id。

mysql 的列是 id , parent_region_id , region_name

结构就像...

SELECT region_id, region_type, region_name, parent_region_id, parent_region_name FROM regions_data WHERE parent_region_id = 201

区域类型为 ....

Country -> Province (State) -> Multi-Region (within a country) -> Multi-City (Vicinity) -> City

只有一些国家/地区有Province (State),其他国家/地区有Multi-Region (within a country)..这两者可能有也可能没有Multi-City (Vicinity)级别。

US -> California -> Central California -> San Joaquin Valley -> Mojave & Vicinity -> California City

像上面一样,美国下面会有很多区域,所有这些区域可能有很多子区域和这些子区域下的城市。

我想要一个完美的 MySQL 查询,它将返回给定区域内的所有城市。

Give me all cities under USGive me all cities under ALASKA STATE

这里有 MySQL 专家来帮助我吗?

【问题讨论】:

  • Mysql 无法进行递归查询。你应该通过 php 代码或程序来做到这一点
  • @splash58 我对程序了解不多。。什么样的程序?可以的话能详细点吗?
  • 可以分享一下你的表结构吗?
  • 我不确定这里是否有人会为您编写代码。尝试询问您将面临的问题
  • 张贴一张你的桌子的截图。很难理解你的桌子是什么样子的

标签: php mysql sql database


【解决方案1】:

您可以使用多个 JOIN 来通过子级别,然后仅打印具有您正在寻找的正确 region_type 的那些。假设您最多有 6 个级别(如果需要,您可以轻松添加更多级别...):

SELECT 
  IF(`t1`.`region_type`='City', `t1`.`region_name`,
    IF(`t2`.`region_type`='City', `t2`.`region_name`,
      IF(`t3`.`region_type`='City', `t3`.`region_name`,
        IF(`t4`.`region_type`='City', `t4`.`region_name`,
          IF(`t5`.`region_type`='City', `t5`.`region_name`, '')
        )
      )
    )
  )
FROM `regions_data`

LEFT JOIN `regions_data` `t1` ON (`t1`.`parent_region_id` = `regions_data`.`id`)
LEFT JOIN `regions_data` `t2` ON (`t2`.`parent_region_id` = `t1`.`id`) 
LEFT JOIN `regions_data` `t3` ON (`t3`.`parent_region_id` = `t2`.`id`) 
LEFT JOIN `regions_data` `t4` ON (`t4`.`parent_region_id` = `t3`.`id`) 
LEFT JOIN `regions_data` `t5` ON (`t5`.`parent_region_id` = `t4`.`id`) 

WHERE `regions_data`.`region_name` = 'ALASKA STATE'

【讨论】:

  • 是否可以在此查询中选择更多列?使用这个我们只能选择 region_name 对吗?
  • 对。那是你的问题。您可以使用与选择正确的region_name 相同的方式添加更多列。
  • 假设这些记录有一列说 view_count,我想按 view_count 排序结果。我怎样才能使用这个查询来实现呢?有可能吗?
  • 您使用与上述相同的结构添加一个view_count 列,然后添加一个ORDER BY 2 子句。
【解决方案2】:

在 mysql 中试试这个:

select @pv:=id as id,region_name, parent_region_id from `your_table_name`
join
(select @pv:=1)tmp
where parent_region_id=@pv

我用1,你可以用你想要的id

【讨论】:

  • 代替1他也可以写select @pv:=id as id,region_name, parent_region_id from table join (select @pv:=(select id from table where region_name='US'))tmp where parent_region_id=@pv;
  • 是的!他还可以使用此子查询来查找 id
  • 我试过了,但我只得到了 3 条记录,而且它们只比美国低一级。不是城市。这是我得到的结果 ----- 202 Alabama 201 6057756 Central Alabama 202 6057762 Oxford(及附近)6057756
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多