只获得每个孩子的第一个父母

时间:2014-03-07 10:36:17

标签: 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))
{
    $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;
}

现在,我得到所有的父母,但我想让父母自下而上达到所需的水平,例如我有15条记录,如果我给child_id = 15和level = 4,那么它应该让我(1)15(2)父母的父母是13(4)父母的13(4)父母12并且不应该继续。

喵,我只需要限制数量,以便将父母提取到所需的水平。

任何更好的解决方案,或者我错误的地方?

表格结构:

id | parent_id | child_id

2 个答案:

答案 0 :(得分:1)

首先,我认为你的桌面结构很古怪。直到我意识到它是一个交叉表,id不是parent_idchild_id所指的。

假设每个孩子只有一个父母,我建议你简单地构建你的表格:

| id | parent_id |

使用NULL parent_id表示id没有父级。查询只是

SELECT * FROM family WHERE parent_id = NULL

如果数据已修复id,可能会或可能不会出现在数据中,请使用

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

找到未在表格中列为parent_id的任何id。但这会假设数据是不完整的......除非你不必信任你的数据,否则它永远不应该存在。

答案 1 :(得分:0)

我来看看Closure Sets。

请阅读幻灯片48,了解使用父/子数据的几种方法。

http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back

您需要重新构建数据 - 是否值得(或不相关)取决于您期望的查询量。