Mysql 拉威尔计数类别联接
我有三个表需要最终查询,我正在寻找最有效的方法 表格包括:产品、产品颜色和类别 这些关系是products.category\u id=>categories.id和product\u colors.product\u id=>products.id(按product\u colors.color\u id过滤) 首先,我有一个产品表,该产品与颜色表有一对多的关系,所以我需要根据颜色对其进行过滤。 其次,我需要按类别对其进行筛选,并返回适合的每个类别中的产品数量 我有下面的查询,它将最终统计我想要的每个类别中的产品,但它不会根据第一个颜色过滤器进行过滤Mysql 拉威尔计数类别联接,mysql,laravel,join,eloquent,Mysql,Laravel,Join,Eloquent,我有三个表需要最终查询,我正在寻找最有效的方法 表格包括:产品、产品颜色和类别 这些关系是products.category\u id=>categories.id和product\u colors.product\u id=>products.id(按product\u colors.color\u 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——有什么办法吗?我设法提出了以下查询,它将有效地返回我需要的内容,并可以选择按性别排序
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)
编辑:我在里面写得很有说服力
$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。如果有人有其他选择,我将不胜感激