Php 仅获取每个子级的第一个父级

Php 仅获取每个子级的第一个父级,php,arrays,Php,Arrays,我正在尝试按顺序获取每个子元素的直接父元素(如果存在也不是父元素),到目前为止,我已尝试此函数: $child_id = 15; $query = "SELECT * FROM family WHERE parent_id < $child_id ORDER By parent_id DESC LIMIT 0,7"; $res = mysql_query($query); while($obj = mysql_fetch_assoc($res)) { $resu

我正在尝试按顺序获取每个子元素的直接父元素(如果存在也不是父元素),到目前为止,我已尝试此函数:

$child_id  = 15;
$query = "SELECT * FROM family WHERE parent_id < $child_id ORDER By parent_id DESC LIMIT 0,7";
$res        =   mysql_query($query);
while($obj = mysql_fetch_assoc($res))
{
    $results[]  =   $obj;
}

$fetchedResults =   fetchParentsById($results, $child_id);

function fetchParentsById($results, $id, $parentfound = false, $parents= array())
{
    foreach($results as $row)
    {
        if((!$parentfound && $row['parent_id'] == $id) || $row['child_id'] == $id && $row['parent_id'] > 0)
        {
            $rowdata = array();
            foreach($row as $k => $v)
                        {
                $rowdata[$k] = $v;
                        }
            $parents[] = $rowdata;
            if($row['child_id'] == $id)
                        {
                $parents= array_merge($parents, fetchParentsById($results, $row['parent_id'], true));
                        }
        }
    }
    return $parents;
}

我想看看闭包集

阅读幻灯片48,了解处理父/子数据的几种方法


您需要重新构造数据—是否值得,取决于您期望的查询量。

首先,我认为您的表结构很古怪。直到我意识到这是一个交叉表,id不是父id或子id所指的

假设每个孩子只有一位家长,我建议您简化表格的结构:

| id | parent_id |
并对父项id使用NULL表示id没有父项。问题很简单

SELECT * FROM family WHERE parent_id = NULL
或者,如果数据具有固定的id,该id可能会出现在数据中,也可能不会出现在数据中,请使用以下查询:

SELECT * FROM family WHERE parent_id <> (SELECT id FROM family GROUP BY id)

查找表中未列为id但假定数据不完整的父项id。。除非您不必信任您的数据,否则不应该是这样。

您能提供表结构的概要吗?只有三列id、父id、子id。。直接父母只需一个查询就可以作为。。。从族中选择*其中child\u id=$child\u id。。。然后使用每行父项Id从其他表中附加数据。。我不明白为什么你需要这样的PHP函数来检测它们?mysql不应该被使用-请用谷歌搜索手册。不推荐使用的函数实际上我想让直系父代的数目有限,而不是超过这个数目,所以,我不得不使用这个函数。。。这可能不是个好主意。。这就是为什么我要求一个更好的解决方案,如果除此之外,以实现预期的结果…谢谢你的答复,是的,我认为这是必要的!谢谢你的建议是的,看来可以了!
SELECT * FROM family WHERE parent_id <> (SELECT id FROM family GROUP BY id)