查询给出双结果而不是单结果

时间:2018-12-17 09:43:51

标签: sql laravel search filter

我有两个表:productscurrent_product_attribute_values

我尝试了一个联接查询,以根据user选择的属性对它们进行过滤,但是当我尝试使用附加条件进行过滤时,它会给我2个结果,而不是一个结果,其中包括第一个结果不匹配根据查询:

select * from `products` inner join `current_product_attribute_values` on `products`.`id` = `current_product_attribute_values`.`product_id` where `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `product_name` LIKE ?

这是我的laravel控制器代码:

 $all = Input::all();  

 $q = Input::get('search_text');

 $att_val = Input::get('attribute_value');

 $subcat = Input::get('subcat_id');

 $subcat_name = DB::table('subcategories')->where('id', $subcat)->value('subcategory_name');

 $brandname = DB::table('brands')->where('subcat_id', $subcat)->value('brand_name');

 $brand_id = DB::table('brands')->where('subcat_id', $subcat)->value('id');

 $product_count = DB::table('products')->where('brand_id', $brand_id)->count();

            if ($q != "") {

// getting multiple same name params    

                $query = DB::table('products');

                $query->join('current_product_attribute_values', 'products.id', '=', 'current_product_attribute_values.product_id');

                $j = 0;

                foreach ($all as $key => $values) {

                    //echo 'my current get key is :  ' . urldecode($key). '<br>';    

                    if ($key == $name[$j]) {

                        $query->where('current_product_attribute_values.attribute_id', '=', $att_id_value[$j]);
                        echo'<br>';
                        print_r($query->toSql());
                        echo'<br>';
                        //echo '<br> key matched and have some value : <br>';
                        //echo count($values);
                        if (count($values) >= 1) {

                             //echo '<br> it has array inside <br>';

                            foreach ($values as $val) {
                                //   or waali query in same attribute                                  
                                echo'<br>';
                                $query->orwhere('current_product_attribute_values.attribute_value_id', '=', $val);

                                print_r($query->toSql());
                                echo'<br>';
                            }
                        }

                        $j++;
                    }
                }

$records = $query->toSql();

                $query->where('product_name', 'LIKE', '%' . $q . '%');

                $records = $query->toSql();

print_r($records);

                $products = $query->paginate(10)->setPath('');

                $pagination = $products->appends(array(
                    'q' => Input::get('q')
                ));

                if (count($products) > 0) {

                    $filters = DB::table('product_attributes')->where('subcategory_id', $subcat)->get(['attribute_title']);
                } else {

                    $filters = array();
                }

                $categories = categories::where('add_to_menu', 1)->with('subcategories')->with('brands')->get();

                $categoryhome = categories::where('add_to_menu', 1)->with('subcategories')->get();

                return view('searchfilter')
                                ->with('productsdata', $products)
                                ->with('filtersdata', $filters)
                                ->with('categories', $categories)
                                ->with('categorieshome', $categoryhome)
                                ->with('subcat_name', $subcat_name)
                                ->with('subcat_id', $subcat)
                                ->with('brandname', $brandname)
                                ->with('product_count', $product_count)
                                ->with('querytext', $q);
            }
            return 'No Details found. Try to search again !';

CurrentProduct_attributes_values table Products Table

2 个答案:

答案 0 :(得分:0)

如果使用原始sql调用db select函数,则更容易。例如:

$query=DB::select("select * from `products` inner join `current_product_attribute_values` on `products`.`id` = `current_product_attribute_values`.`product_id` where `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `product_name` LIKE ?
");

实际上,如果需要,您可以在原始sql中连接vars,例如:

$queryBrands = "select id from brands where subcat_id =".$subcat;
//echo $queryBrands
$queryBrands = DB::select($queryBrands);

答案 1 :(得分:0)

通过查看您的表,product值为{strong> 17 的id表在{列的表current_product_attribute_values中有两条记录{1}}(我假设此列用作product_id表的外键)。

使用product,从两个表中选择列的 all 。因此,很可能会导致您的查询返回多个记录。

我的建议:

  • 仅选择所需的列。避免长期使用select *,即select *
  • 使用select product.id, product.description, current_product_attribute_values.attribute_values ......

希望这些帮助。