PHP递归查找兄弟姐妹


PHP Recursive Find siblings

用了一段时间了…我的头脑不清醒…呃呃……帮助这里;-)我相信这很简单。

表:

CREATE TABLE IF NOT EXISTS `items` (
 `item_id` bigint(20) NOT NULL AUTO_INCREMENT,
 `item_parent_id` bigint(20) NOT NULL COMMENT 'itemid which this item belongs to',
 `item_name` varchar(255) NOT NULL,
 `item_serialnumber` varchar(255) NOT NULL,
 `item_model` varchar(255) NOT NULL,
  PRIMARY KEY (`item_id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

我试图创建一个数组的item_id和item_id,它属于-通过item_parent_id递归-

这样,即使你找到了父母的孩子,检查孩子是否是其他人的父母。

试过这样做:

function get_item($item_id, $menu)
{
$sql = "
SELECT
    items.*,
    customers.*
FROM
    assets
LEFT JOIN item_customer_rel USING(item_id)
LEFT JOIN customers USING(customer_id)
WHERE
    items.item_parent_id = '".$parent."'
ORDER BY
    items.item_name
";
$res = mysqli_query($db, $sql) or die("ERROR: SQL Select a2a ancestor", $sql, mysqli_error($db) , $_SESSION["u_id"]);
while ($items = mysqli_fetch_assoc($res))
    $menu = build_ancestor_array($parent, $menu);
}

function build_ancestor_array($parent, $menu)
{
GLOBAL $db;
$sql = "
SELECT
    items.*,
    customers.*
FROM
    items
LEFT JOIN item_customer_rel USING(item_id)
LEFT JOIN customers USING(customer_id)
WHERE
    items.item_parent_id = '".$parent."'
";
$res = mysqli_query($db, $sql) or cc("ERROR: SQL Select a2a ancestor", $sql, mysqli_error($db) , $_SESSION["u_id"], $this_document);
while ($items = mysqli_fetch_assoc($res))
{
    if ($ancestor_item_array[$parent] == $items["item_id"])
        $menu = build_ancestor_array($parent, $menu);
    $ancestor_item_array[$parent] = $items["item_id"];
    // Creates entry into items array with current menu item id ie. $menu['items'][1]
    $menu['items'][$items['item_id']] = $items;
    $menu['items'][$items['item_id']]["connection_type"] = 2;
    // Creates entry into connected_to array. connected_to array contains a list of all items with connected_to
    $menu['connected_to'][$items['item_parent_id']][] = $items['item_id'];
}
return $menu;
} // end build item array

它只向下"一级"。

参考下面的2 links,我最近发布了这些问题的答案,这是在纯SQL中完成的

关系型innoDB递归MySQL查询

如何在MySQL中找到所有子行?

递归工作。只需要用笔和纸手工尝试;-)

function get_item_data($parent, $menu, $ancestor_item_array = "")
{
    GLOBAL $db;
    $sql = "
    SELECT
        items.*,
        customers.*
    FROM
        items
    LEFT JOIN item_customer_rel USING(item_id)
    LEFT JOIN customers USING(customer_id)
    WHERE
        items.item_parent_id = '".$parent."'
    ORDER BY
        items.item_name
    ";
    $res = mysqli_query($db, $sql) or cc("ERROR: SQL Select a2a ancestor", $sql, mysqli_error($db) , $_SESSION["u_id"], $this_document);
    while ($items = mysqli_fetch_assoc($res))
    {
        $ancestor_item_array[] = $items["item_id"];
        if (!in_array($items["item_parent_id"], $ancestor_item_array))
            $menu = get_item_data($items["item_id"], $menu, $ancestor_item_array);
        // Creates entry into items array with current menu item id ie. $menu['items'][1]
        $menu['items'][$items['item_id']] = $items;
        $menu['items'][$items['item_id']]["connection_type"] = 2;
        // Creates entry into connected_to array. connected_to array contains a list of all items with connected_to
        $menu['connected_to'][$items['item_parent_id']][] = $items['item_id'];
    }
}

它不能在纯SQL上工作。

你应该看看存储过程,你想要做的sql只会"向内"一层,因为所有的关系都会被显示为第一级连接。

例如

。母公司-> ->孙子儿子> ggson

parent.item_parent_id = null
son.item_parent_id = parent
grandson.item_parent_id = son
ggson.item_parent_id = grandson

即使强硬的孙子是一个较低级别的连接,他也会以一级连接的形式出现。

不能用纯sql完成,遗憾的是…这也是我选择NOSQL数据库的原因之一