1

我有category一个存储所有category信息的表 [ parentand childboth] ,category_child一个存储parentand的表child category relation,以及一个存储 andproduct_category之间关系的child_categoryproduct

  1. category- 所有类别 { cid, cname, isParent, status} 列。

  2. category_child- 房地产 { parent_id, child_id}。

  3. category_product- 关系 { product_id, child_category_id}

  4. product- 所有产品详情 { pid, pname, pimage, pprice, pstock}

我在首页显示所有父类别链接。现在,每当有人点击父类别链接时,我想显示product每个child category.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();

请帮助最小化我的代码中的嵌套 while 和查询

谢谢

4

3 回答 3

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 个产品的限制,所以我也没有放。

于 2013-10-01T20:09:54.143 回答
2

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

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

于 2013-10-01T20:10:21.823 回答
1

永远不要在循环中使用 SQL 查询!它非常慢,您可以超载 sql server 等...

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

树 1 级:

      1A2

树 2 级:

      1A6
   2B3   4C5

树 3 级:

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

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

将模型转换为嵌套集后,您可以使用简单的 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 等...因为您只想询问每个类别的单个产品...(或者您可以简单地使用 order by rand() 和 limit 4 ... )

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

于 2013-10-01T20:07:38.693 回答