通过PHP中的父类别从子类别中获取产品详细信息

时间:2013-10-01 19:42:40

标签: php mysql sql optimization e-commerce

我有category表,其中存储了所有category信息[parentchild两者],category_child表,其中存储了parent和{ {1}} childcategory relation表格,用于存储product_categorychild_category之间的关系。

  1. product - 所有类别{categorycidcnameisParent}列。

  2. status - Realtion {category_childparent_id}。

  3. child_id - 关系{category_productproduct_id}

  4. child_category_id - 所有产品详情{productpidpnamepimagepprice}

  5. 我在首页显示所有父类别链接。现在,每当有人点击父类别链接时,我想显示来自pstock product的每个child category的4 parent category个信息。

    这是我的代码,目前可怕,我正在寻找一些尽可能减少它的帮助。

    $fetchChild = $mysqli->query("SELECT child_id from category_child where parent_id='".$mysqli->real_escape_string($pid)."'");
    $listchild = array();
    if($fetchChild->num_rows > 0) {
        $n = 1;
        while($storeChild = $fetchChild->fetch_assoc()) {
            $listchild['child_id'][$n] = $mysqli->query("SELECT product_id from category_product where child_category_id='".$mysqli->real_escape_string($storeChild[$n])."'");
            if($listchild['child_id'][$n]->num_rows > 0) {
                $i = 1;
                while($storeMore = $listchild['child_id'][$n]->fetch_assoc()) {
                    $listchild['product_id'][$i] = $mysqli->query("SELECT pid, pname, pimage, pprice, pstock from product where pid='".$mysqli->real_escape_string($storeMore[$i])."'");
                    if($listchild['child_id'][$n]['product_id'][$i]->num_rows > 0) {
                        $me = 1;
                        while($smeLast = $storeMore[$i]->fetch_assoc()) {
                            $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pid'];
                            $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pname'];
                            $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pimage'];
                            $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pprice'];
                            $listchild['child_id'][$n]['product_id'][$i]['pid'] = $smeLast['pstock'];
                            $me++;
                        }
                    } else {
                        echo '<meta http-equiv="refresh" content="0; url=index.php?error=Something+Went+Wrong+We+are+Fixing+it" />';
                    }
                    $listchild['product_id'][$i]->free();
                    $i++;
                }
            }
            $listchild['child_id'][$n]->free();
            $n++;
        }
    
    } else {
        echo '<meta http-equiv="refresh" content="0; url=index.php" />';
    }
    $fetchChild->free();
    

    请在我的代码中尽量减少嵌套时间和查询

    由于

3 个答案:

答案 0 :(得分:2)

如果需要,可以使用JOIN语句将所有内容放入一个SQL查询中。

SELECT `category`.*, `product`.* FROM `product` 
LEFT JOIN `category_product` ON `category_product`.`product_id` = `product`.`pid`  
LEFT JOIN `category_child` ON `category_child`.`child_id` =  `category_product`.`child_id`
LEFT JOIN `category` ON `category`.`cid` = `category_child`.`child_id`
WHERE `category_child`.`parent_id`='".$mysqli->real_escape_string($pid)."'

但我不认为这是最好的解决方案。

PS。顺便说一句,你的代码中每个孩子类别没有限制4种产品,所以我也没有把它放在一起。

答案 1 :(得分:2)

您可以使用JOINS将所有查询减少到一个查询。使用连接将允许您根据另一个或多个表中提供的条件(例如category_product,category_child)从一个表(例如产品)返回结果。

在Stack Overflow上阅读有关联接的更多信息或浏览其他一些资源。例如http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

答案 2 :(得分:1)

你永远不应该在循环中使用SQL查询!它很慢,你可以重载sql server等...

您的数据库结构不好。如果你想存储层次树,有更好的选择:

树1级:

      1A2

树2级:

      1A6
   2B3   4C5

树3级:

          1A12
   2B7    8C9   10D11
3E4   5F6

每个节点都有左值和右值,您也可以拥有父ID。如果检查左右差异,可以检查节点是叶子还是分支。叶子是一个。如果叶子的左侧大于分支的左侧并且其右侧小于分支的右侧,则可以检查叶子是否在分支下。 etc ...这个结构在几个站点上描述,例如:nested set model

将模型转换为嵌套集后,您可以使用简单的SQL来询问您的产品。像这样:

SELECT
    p.*
FROM
    categories c, categories b, products p, product_categories pc
WHERE
    b.category_id = ?
AND
    c_category_id <> b.category_id
AND
    c.category_left BETWEEN b.category_left AND b.category_right
AND
    c.category_right - c.category_left = 1
AND
    c.category_id = pc.category_id
AND
    p.product_id = pc.product_id

这对于开始是好的,你的代码将包含group by,limit等...因为你想要每个类别只询问一个产品......(或者你可以简单地使用rand()的命令并限制4 ...)

您应该使用预准备语句而不是手动转义... http://php.net/manual/en/mysqli.prepare.php