我有category
表,其中存储了所有category
信息[parent
和child
两者],category_child
表,其中存储了parent
和{ {1}} child
和category relation
表格,用于存储product_category
和child_category
之间的关系。
product
- 所有类别{category
,cid
,cname
,isParent
}列。
status
- Realtion {category_child
,parent_id
}。
child_id
- 关系{category_product
,product_id
}
child_category_id
- 所有产品详情{product
,pid
,pname
,pimage
,pprice
}
我在首页显示所有父类别链接。现在,每当有人点击父类别链接时,我想显示来自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();
请在我的代码中尽量减少嵌套时间和查询。
由于
答案 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