我有三个表需要最终查询,我正在寻找最有效的方法。
表格是:products,product_colors和categories。
关系是products.category_id => categories.id和product_colors.product_id => products.id(按product_colors.color_id过滤)
首先我有一个产品表,该产品与颜色表有一对多的关系,所以我需要根据颜色过滤它。 其次,我需要按类别过滤它,并返回它适合的每个类别中的产品数量。
我有以下查询,它最终将计算我想要的每个类别中的产品,但它不会根据第一个颜色过滤器进行过滤。
SELECT categories.name, SUM(IF(category_id IS NULL, 0, 1)) AS categories
FROM products JOIN categories ON (categories.id = products.category_id)
WHERE(products.gender = 1) GROUP BY categories.id;
我不太熟悉查询或联接方面的效率与否,但我想到的可能是获得与过滤颜色相匹配的产品ID列表,然后以某种方式进行连接只是那些ID。
编辑:在我下面的回答中,我提出了一个解决方案,但它正在使用DB:raw - 有什么方法吗?
答案 0 :(得分:0)
我设法提出了以下有效返回我需要的查询,并可选择按性别排序。
mysql> SELECT categories.name, SUM(IF(category_id IS NULL, 0, 1)) AS
categories FROM products LEFT JOIN product_colors ON
(product_colors.product_id = products.id) LEFT OUTER JOIN categories
ON (categories.id = products.category_id) WHERE(products.gender = 1 AND
product_colors.color_id = 1) GROUP BY categories.id;
+--------------+------------+
| name | categories |
+--------------+------------+
| トップス | 35 |
| アウター | 1 |
| ボトムス | 7 |
| シューズ | 21 |
| 帽子 | 2 |
+--------------+------------+
5 rows in set (0.00 sec)
编辑:我已经改写了Eloquent。
$categories = Category::select('categories.name',DB::raw('SUM(IF(category_id IS NULL, 0, 1)) AS categories'))
->join('products','categories.id','=','products.category_id')
->join('product_colors','product_colors.product_id','=','products.id','left outer')
->where('products.gender','=',1)
->where('product_colors.color_id','=',1)
->groupBy('categories.id')
->get();
我觉得解决方案并不是太糟糕,但我不喜欢它使用DB:raw的事实。如果有人有替代方案,我将不胜感激。