gpt4 book ai didi

mysql - 请需要复杂的分层 SQL 查询帮助!

转载 作者:行者123 更新时间:2023-11-29 03:45:52 24 4
gpt4 key购买 nike

召集所有 mySQL 高手!

我需要一个复杂的 mySQL 查询,但我无法理解它。有 2 个表有问题:

地点
(列:location_id、parent、location)
数据以分层方式分为国家、地区、县和城镇,因此:
1, 0, 英格兰(国家)
2, 1, 西南(地区)
3, 1, 东南(地区)
4, 2, 多塞特郡()
5, 4, 伯恩茅斯 ()
6, 4, Poole(城镇)
7, 4, Wimborne()
等多达 400 多行位置数据

个人资料
(列:profile_id、title、location_id)
每一行都有一个位置 ID,它总是一个城镇(即最后一个 child )。例如:
1, '此配置文件的位置设置为伯恩茅斯', 5
2, '此配置文件的位置设置为 Poole', 6
等等

我需要实现的是从 Locations 表中返回所有 ID,在该表中,它本身或其子项具有与之关联的条目。因此,在上面的示例中,我需要返回以下位置 ID:1、2、4、5、6

原因:
1 - 是的,英格兰是西南、多塞特和伯恩茅斯的 parent ,后者有一个条目
2 - 是的,South West 是 Dorset 和 Bournemouth 的父级,后者有一个条目
3 - 不,South East 在它或它的任何子项下没有条目
4 - 是的,多塞特是伯恩茅斯的 parent ,伯恩茅斯有一个条目
5 - 是的,伯恩茅斯有一个条目
6 - 是的,普尔有一个条目
7 - 不,Wimborne 没有条目

那么,这真的可能吗?我试图在 PHP 中使用嵌套的 SQL 查询来执行此操作,但脚本超时,所以必须有一种方法可以仅在 SQL 查询中执行此操作?

提前致谢! :)

===========

更新

通读并尝试了所有这些解决方案后,我意识到我正在以完全错误的方式解决问题。与其遍历所有位置并返回那些具有条目的位置,不如获取所有条目并返回相应的位置,然后在层次结构中向上获取每个位置的父位置,直到找到根为止,这更有意义并且效率更高。

非常感谢你的帮助,它至少让我意识到我的尝试是不必要的。

最佳答案

我处理这个问题的方法是只执行一次 SQL 加载,然后将引用放在父对象中。

    $locations = array();        $obj_query = "SELECT * from locations";        $result_resource = mysql_query($obj_query);        while ($row = mysql_fetch_assoc($result_resource) {            $locations[$row['location_id'] = (object) $row;        }        foreach ($locations as $location) {            if (isset($location->parent) {                $locations[$location->parent]->children[] = $location;            }        }

然后您的对象将需要这样的方法来确定某个位置是否是后代:

function IsAnscestorOF ($location) {    if (empty($children)) { return false; }    if (in_array($location, keys($this->children) {        return true;    } else {        foreach ($children as $child) {             if ($child->isAnscestor) {                 return true;             }         }     }     return false;}

关于mysql - 请需要复杂的分层 SQL 查询帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5628962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com