我试图按顺序获得每个子元素的直接父元素(如果存在也不是祖父母),到目前为止我已经尝试过这个函数:
$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
答案 0 :(得分:1)
首先,我认为你的桌面结构很古怪。直到我意识到它是一个交叉表,id
不是parent_id
或child_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
您需要重新构建数据 - 是否值得(或不相关)取决于您期望的查询量。