0

用这个工作了一段时间..我的头不对..所以......在这里帮助;-)我相信这很简单..

桌子:

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

它只会下降一个“级别”。

4

3 回答 3

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'];
    }
}
于 2013-04-16T20:57:37.823 回答
0

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

具有关系 innoDB 的递归 MySQL 查询

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

于 2013-04-16T19:05:01.817 回答
-1

它不适用于纯 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 数据库的原因之一。

于 2013-04-16T19:01:24.097 回答