我希望检索具有给定父类别的所有子类别,并希望将我的products表连接到该结果。结果应该是一个面包屑导航,用户可以在其中单击父类别,并检索该类别中的所有产品以及子类别。
Breadcrumb看起来是这样的:Electronic >> Music >> MP3-Player >> Flash如果用户点击“音乐”,结果应该包含“音乐”、“mp3播放器”和"Flash“类别中的所有产品。
我使用嵌套set,但我发现很难处理复杂的查询。
我的数据库是这样的:
图片: ID /名称/ lft / rgt products_table: ID /标题/描述/图片/ category_id / ...
我的查询现在看起来像这样:
$result=mysql_query('SELECT *, node.id, node.name
FROM category AS node,
category AS parent,
category AS sub_parent,
(
SELECT node.name
FROM category AS node,
category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.id = 23
GROUP BY node.name
ORDER BY node.lft
)AS sub_tree JOIN products ON products.id = id
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
ORDER BY node.lft;') or die(mysql_error());但这给出了错误"#1104 - SELECT将检查多于MAX_JOIN_SIZE的行;如果SELECT没有问题,请检查WHERE并使用SET SQL_BIG_SELECTS=1或SET MAX_JOIN_SIZE=#“。我还是不明白。
发布于 2013-06-01 21:17:50
试试这个PHP脚本。它可能有几个语法错误,我还没有测试它,但它应该可以做你想要的。
需要注意的是,您需要向categories表中添加一个名为category_parent_id的字段,并将其缺省值设置为0或null。
class breadcrumbNav
{
private $dataArray = array();
private $breadcrumb = array();
public function __construct()
{
$this->getAllRecords();
return;
}
private function getAllRecords()
{
$result = $db->prepare("
SELECT p.ID as product_id, p.title AS product_title, p.description AS product_description, p.pic AS product_picture,
c.ID as category_id, c.Name as category_name, c.lft AS category_lft, c.rgt AS category_rgt, c.parent_id AS category_parent_id
FROM products p
LEFT JOIN categories c
ON p.category_id = c.ID
");
$result->execute();
$this->dataArray = $result->fetchAll(PDO::FETCH_ASSOC);
return;
}
function buildBreadcrumb($recordId, $firstRun = true)
{
foreach($this->dataArray as $row)
{
if(($row['product_id']==$recordId && $firstRun) || ($row['category_id']==$recordId && $firstRun===false))
{
$this->breadcrumb[] = '<a href="?categoryId=' . $row['category_id'] . '">' . $row['category_name'] . '</a>';
if($row['category_parent_id']!==0 && !is_null($row['category_parent_id']))
{
$this->buildBreadcrumb($this->buildBreadcrumb($row['category_parent_id'], false));
}
}
}
return implode(' >> ', $this->breadcrumb;
}
}
$currentProductId = 'ENTER THE PRODUCT ID HERE';
$breadcrumbObject = new breadcrumbNav();
$breadcrumb = $breadcrumbObject->buildBreadcrumb($currentProductId);https://stackoverflow.com/questions/16872819
复制相似问题