我有一个用于跟踪点击次数的菜单的数据库。菜单包含类别和子类别,我尝试获取每个类别的点击量,但在数据库中,如果项目在一个中,则点击将注册到子类别,否则点击将计入类别中。我有一个查询可以获得所有子类别(category_type
3)的点击次数,但我需要添加来自其父类别(category_type
2)的点击次数。有一个名为CategoryHierarchy
的表格将每个类别映射到它的父类别。这就是我所拥有的:
SELECT IFNULL(SUM(`MenuEntryAnalytics`.`opened`), 0) AS `clicks`,
`Categories`.`id`,
`Categories`.`name`,
`Categories`.`category_type`,
`CategoryHierarchy`.`parent_id` AS `parent`
FROM `MenuEntryAnalytics`
INNER JOIN `MenuEntries`
ON `MenuEntryAnalytics`.`menu_entry_id` = `MenuEntries`.`id`
LEFT JOIN `MenuEntryToCategory`
ON `MenuEntryAnalytics`.`menu_entry_id` = `MenuEntryToCategory`.`menu_entry_id`
RIGHT JOIN `Categories`
ON `MenuEntryToCategory`.`category_id` = `Categories`.`id`
RIGHT JOIN `CategoryHierarchy`
ON `Categories`.`id` = `CategoryHierarchy`.`category_id`
WHERE `Categories`.`category_type` = 3
GROUP BY `id`;
结果:
clicks id name type parent
=============================================
2032 3 Appetizers 3 2
455 4 Salads 3 2
680 6 Sandwiches 3 5
424 7 Burgers 3 5
584 9 Pizza 3 8
466 10 Kids Menu 3 8
1445 12 Soda 3 11
1089 13 Signature Cocktails 3 11
391 14 Bottled Beer 3 11
167 15 Wine 3 11
0 17 Events 3 16
0 18 Sponsors 3 16
186 19 Dessert 3 11
621 26 Restaurants 3 22
263 27 Bars 3 22
112 28 Services 3 25
254 29 Amenities 3 25
67 30 Exclusive Benefits 3 25
190 31 Area Attractions 3 24
14 32 Entertainment 3 24
2 33 Shopping 3 24
117 34 Transportation & Tours 3 24
471 35 Mixed Drinks 3 11
541 36 Draft Beer 3 11
如果我GROUP BY
parent
那么我可以获得我需要的大部分内容(来自每个类别的子类别的所有点击)但是这并没有将点击次数计入类别(相反)到子类别,即category_type
2)。我试图添加该部分,我只能想到使用子查询,但我无法识别我正在查看哪个类别,因此我得到一个包含多行的子查询
PS我无权重组数据库。
答案 0 :(得分:0)
由于父ID与ID位于同一名称空间,因此您可以简单地使用IFNULL来选择父项(如果存在),或者使用ID。并将其用作分组策略。
您可能还希望选择与实际列相同的数据。
GROUP BY
IFNULL(CategoryHierarchy
。parent_id
,Categories
。id
,CategoryHierarchy
。parent_id
)