【问题标题】:MySQL: SUM data from two different tablesMySQL:来自两个不同表的 SUM 数据
【发布时间】:2015-03-26 00:50:58
【问题描述】:

我有一个用于跟踪点击的菜单的数据库。菜单有类别和子类别,我正在尝试获取每个类别的点击量,但在数据库中,如果项目在一个中,点击将注册到子类别,否则点击计入类别。我有一个查询将获得所有子类别的点击(category_type3),但我需要将它们与来自其父类别的点击一起添加(category_type2)。有一个名为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 那么我可以获得我需要的大部分内容(来自每个类别的子类别的所有点击)但这不会将点击计入类别(与子类别相反,即 @987654328 @2)。我一直在尝试添加该部分,我所能想到的只是使用子查询,但无法确定我正在查看哪个类别,因此我得到了一个包含多行的子查询。

PS 我无权重组数据库。

【问题讨论】:

  • 你想得到parent=2type=2 的总和吗?
  • category_type = 3 的点击总和是parent_idcategory_type = 2 的一个类别
  • 所以所有category_type = 3parent_id相同的总和+与id相同的类别的点击次数等于parent_id

标签: mysql


【解决方案1】:

由于父 ID 与 ID 在同一个命名空间中,您可以简单地使用 IFNULL 来选择父 ID(如果存在),否则选择 ID。并将其用作您的分组策略。

您可能还想选择与实际列相同的数据。

分组依据 IFNULL(CategoryHierarchy.parent_id, Categories.id, CategoryHierarchy.parent_id)

【讨论】:

  • 问题是 category_type 2 (顶级类别)将有一个 parent_id 指向其所在的菜单。所以在我所在的行中它永远不会为空寻找。
  • 在这种情况下,我会使用 IF(category_type=2,id,parent_id) 并使用 WHERE 限制为 2 或 3 列。如果需要,您还可以嵌套 IF() 或 CASE()匹配超过 2 个值。
猜你喜欢
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多