Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化用于报告的复杂MySQL选择_Mysql_Sql_Database Design_Relational Database_Subquery - Fatal编程技术网

优化用于报告的复杂MySQL选择

优化用于报告的复杂MySQL选择,mysql,sql,database-design,relational-database,subquery,Mysql,Sql,Database Design,Relational Database,Subquery,我正在构建一个应用程序 每个图书管理员都可以创建一个活动 b作为该活动的一部分执行的活动在活动_活动中跟踪,活动为页面加载 为了报告每个活动中采取的行动数量,针对以下数据库结构,旨在跟踪图书馆员为每个活动采取的行动数量: LIBRARIANS id | status CAMPAIGNS id | librarian_id CAMPAIGN_ACTIONS id | campaign_id | name 我遇到的问题是: a我必须指定要在相关子选择中计数的字段 b因此,查询将非常昂贵 我的问题

我正在构建一个应用程序

每个图书管理员都可以创建一个活动 b作为该活动的一部分执行的活动在活动_活动中跟踪,活动为页面加载

为了报告每个活动中采取的行动数量,针对以下数据库结构,旨在跟踪图书馆员为每个活动采取的行动数量:

LIBRARIANS id | status CAMPAIGNS id | librarian_id CAMPAIGN_ACTIONS id | campaign_id | name 我遇到的问题是:

a我必须指定要在相关子选择中计数的字段 b因此,查询将非常昂贵

我的问题是,既然一个活动有多个操作,我如何才能更有效地计算每个活动的操作数

较不复杂的查询相当于返回如下结果集:

librarians.id | librarians.status | campaign_actions.name 1 3 pageX 1 3 pageY 1 3 pageZ 1 3 pageA 1 3 pageB 2 3 pageX 这意味着我必须逐行解析应用程序代码中的结果集,这可能会更加昂贵


我很感激你对这个问题的任何想法

像这样的东西对你有用吗

SELECT librarians_id,COUNT(librarians_id) FROM ( SELECT librarians.id as librarians_id, librarians.status as librarians_status, campaign_actions.name as campaign_actions_name FROM campaign_actions INNER JOIN campaigns ON campaign_actions.campaign_id = campaigns.id INNER JOIN librarians ON campaigns.librarian_id = librarians.id GROUP BY campaign_actions.name,librarians.id,librarians.status ) as a
也许我误解了你的意思。内部查询似乎会返回上面表示的表。

将任务分解为更小的任务视图:

--- campaings per librarian
CREATE VIEW count_librarian_campaigns
AS ( SELECT lib.id AS lib_id
          , COUNT(c.id)
                   AS num_campaigns
     FROM librarians lib
     LEFT JOIN campaigns c
       ON c.librarian_id = lib.id
     GROUP BY lib.id
   )

--- campaign actions per campaign
CREATE VIEW count_campaign_actions
AS ( SELECT c.id   AS c_id
          , COUNT(ca.campaign_id)
                   AS num_actions
     FROM campaigns c
     LEFT JOIN campaign_actions ca
       ON ca.campaign_id = c.id
     GROUP BY c.id
   )
因此,您可以有如下查询:

SELECT lib.id AS lib_id
     , countlibc.num_campaigns
     , c.id   AS c_id 
     , countca.num_actions
FROM librarians lib
JOIN count_librarian_campaigns countlibc
  ON countlibc.lib_id = lib.id
LEFT JOIN campaigns c
  ON c.librarian_id = lib.id
JOIN count_campaign_actions countca
  ON countca.c_id = c.id

我建议你把任务分成几个小的部分。一个视图用于计算每个利比亚人的活动,一个视图用于计算每个活动的活动操作,等等。然后使用您需要的活动,将它们与表连接起来。