我有一个函数,它接受一个类别的名称并返回与该类别关联的所有过滤器组以及与每个组关联的过滤器。 但是有太多的循环和查询进行,有没有办法改善下面的代码?带有太多循环的SQL查询
public function getCategoryFilters($category_id) {
// get category filter groups
$query = $this->app['db']->query("SELECT filter_group_id
FROM " . DB_PREFIX . "category_filter
WHERE category_id = '" . (int)$category_id . "'
");
if($query->rows) :
foreach ($query->rows as $group) :
$filter_group_query = $this->app['db']->query("
SELECT DISTINCT fg.filter_group_id, fgd.name, fg.sort_order
FROM " . DB_PREFIX . "filter_group fg
LEFT JOIN " . DB_PREFIX . "filter_group_description fgd ON (fg.filter_group_id = fgd.filter_group_id)
WHERE fg.filter_group_id = '" . $group['filter_group_id'] . "'
AND fgd.language_id = '1'
GROUP BY fg.filter_group_id
ORDER BY fg.sort_order, LCASE(fgd.name)");
foreach ($filter_group_query->rows as $filter_group) :
$filter_data = array();
$filter_query = $this->app['db']->query("
SELECT DISTINCT f.filter_id, fd.name FROM " . DB_PREFIX . "filter f
LEFT JOIN " . DB_PREFIX . "filter_description fd ON (f.filter_id = fd.filter_id)
WHERE f.filter_group_id = '" . (int)$filter_group['filter_group_id'] . "'
AND fd.language_id = '1'
ORDER BY f.sort_order, LCASE(fd.name)");
foreach ($filter_query->rows as $filter) :
$filter_data[] = array(
'filter_id' => $filter['filter_id'],
'name' => $filter['name']
);
endforeach;
if ($filter_data) :
$filter_group_data[] = array(
'filter_group_id' => $filter_group['filter_group_id'],
'name' => $filter_group['name'],
'filter' => $filter_data
);
endif;
endforeach;
endforeach;
return $filter_group_data;
endif;
}
我将实现这两种方法,并在执行时间方面看到两者之间的差异。如果第二个建议运行得更快,我将评论这些功能解决方案,并将其作为参考。非常感谢。 – user1709251