优化用于报告的复杂MySQL选择
我正在构建一个应用程序 每个图书管理员都可以创建一个活动 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 这意味着我必须逐行解析应用程序代码中的结果集,这可能会更加昂贵优化用于报告的复杂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因此,查询将非常昂贵 我的问题
我很感激你对这个问题的任何想法 像这样的东西对你有用吗 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
我建议你把任务分成几个小的部分。一个视图用于计算每个利比亚人的活动,一个视图用于计算每个活动的活动操作,等等。然后使用您需要的活动,将它们与表连接起来。