关于ecshop扩展商品属性查询的另一种SQL语句写法

2016-07-07 15:03 来源:www.chinab4c.com 作者:ecshop专家



在书写php的查库的SQL语句是,执行效率是我们必须思考的一个问题,ecshop在实现属性筛选时官方的写法是:

/* 扩展商品查询条件 */
if (!empty($filter_attr))
{
$ext_sql = "SELECT DISTINCT(b.goods_id) FROM " . $ecs->table('goods_attr') . " AS a, " . $ecs->table('goods_attr') . " AS b, " . $ecs->table('goods') . " AS g " . "WHERE ";
$ext_group_goods = array();
foreach ($filter_attr AS $k => $v) // 查出符合所有筛选属性条件的商品id */
{
if ($v != 0)
{
$sql = $ext_sql . "a.attr_id = b.attr_id AND b.attr_value = a.attr_value AND a.attr_id = " . $cat_filter_attr[$k] ." AND a.goods_attr_id = " . $v;
$ext_group_goods = $db->getCol($sql);
$ext .= ' AND ' . db_create_in($ext_group_goods, 'g.goods_id');
}
}
}

我的另一种写法是:
/* 扩展商品查询条件 */
$i=0;
if ($filter_attr_arr)
{
/* 查出符合条件商品id */
$attr_con = ' 1 ';
foreach ($filter_attr_arr as $k=>$v)
{
if ($i > 0)
{
$attr_table .= ', '.$ecs->table('goods_attr')." AS a".$i;
$attr_where .= " AND a".$i.".goods_id = a".($i-1).'.goods_id'. " AND ( a".$i.".attr_id = '".$k."' AND a".$i.".attr_value = '$v' ) ";
}
else
{
$attr_table = ' '.$ecs->table('goods').' AS g, '.$ecs->table('goods_attr')." AS a0";
$attr_where = " WHERE g.goods_id = a0.goods_id AND g.is_on_sale = 1 AND g.is_alone_sale = 1 AND g.is_delete = 0 AND ( a0.attr_id = '".$k."' AND a0.attr_value = '$v') ";
}
$i++;
}
$sql = "SELECT DISTINCT(g.goods_id) FROM " . $attr_table .$attr_where;
$col = $db->getCol($sql);
$ext = ' AND ' . db_create_in($col, 'g.goods_id');
}
}
两种方法的异同:
第一种官方的查库是多次查库,得出多组goods_id用and并在一起得到一个最终的条件
第二种方法的查库是一次查库,得出一个最终条件,第二种得出的最终goods_id的范围可能小得多,但用了多表关链的方法
两种方法熟优熟劣,仁都见仁智者见智,个人习惯于第二种方法,很久以前的代码翻出来供大家共亨一下

回答:
支持下~~

路过
支持一下

支持!!

支持优化提速GO

这样查询会快点。。

楼主看见把这个修正一下吧。2.71下测试,用你写的这个代码。属性筛选不能使用。希望你能测试一下

纯支持,想在首页实现调用相同属性的商品,结果没实现 。楼主有空是否可以请教下

楼主的速度确实比较快,不过有个问题,除了品牌和价格的筛选是正确的外,颜色尺寸的筛选结果丝毫没有起作用啊,望楼主贴个新版的出来2.7.1

关注一下,感觉很好!

kwkwkwkwkwkwkwkwkw哈哈!!!!