PHP递归查找兄弟姐妹

时间:2013-04-16 18:53:26

标签: php recursion

使用了一段时间..不能让我的头脑正确.. sooo ...帮助在这里;-) 我很确定这很简单。

表:

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 - recursivly -

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

尝试过这样的事情:

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

只有一个“水平”下降。

3 个答案:

答案 0 :(得分:0)

请参阅下面的2 links,我最近发布了这些答案,这是以纯SQL

完成的

<强> Recursive MySQL Query with relational innoDB

<强> How to find all child rows in MySQL?

答案 1 :(得分:0)

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

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'];
    }
}

答案 2 :(得分:-1)

它不适用于纯SQL。

你应该看看存储过程,你试图制作的sql只会向内“进入”一个级别,因为所有的关系都会显示为好像它们是第一级连接。

例如,

。     父 - &GT;女婿&GT; grandson-&GT; ggson

parent.item_parent_id = null
son.item_parent_id = parent
grandson.item_parent_id = son
ggson.item_parent_id = grandson
即使是坚强的孙子也是一个较低级别的联系,他将作为一级联系出现。

不能用纯sql完成,遗憾的是...... 这是让我去NOSQL数据库的原因之一。