【问题标题】:Count Total from Multiple Tables从多个表中计算总数
【发布时间】:2019-02-04 07:06:26
【问题描述】:

我有一个列表,每个部分基本上包含相同的字段。

- p_ticket1_m_site_data   |  - p_ticket1_ticket  |  - p_ticket1_last_row
- p_ticket2_m_site_data   |  - p_ticket2_ticket  |  - p_ticket2_last_row
- p_ticket3_m_site_data   |  - p_ticket3_ticket  |  - p_ticket3_last_row

我可以单独对每张桌子进行计数:

SELECT COUNT( * ) AS tot_sites, IFNULL( COUNT( 
            CASE WHEN p_ticket1_m_site_data.m_date_target = DATE( NOW( ) ) 
            THEN 1 
            ELSE NULL 
            END ),0) AS todays_target, IFNULL( COUNT( 
            CASE WHEN (
            p_ticket1_m_site_data.m_date_target = DATE( NOW( ) ) 
            AND p_ticket1_ticket.t_status =9 ) 
            THEN 1 
            ELSE NULL 
            END ),0
            ) AS todays_achieve, IFNULL( COUNT( 
            CASE WHEN p_ticket1_ticket.t_status =9
            THEN 1 
            ELSE NULL 
            END ),0 ) AS tot_in
            FROM p_ticket1_m_site_data
            LEFT JOIN p_ticket1_last_row ON p_ticket1_last_row.t_m_id = p_ticket1_m_site_data.m_id
            AND p_ticket1_last_row.t_req_type = '04_int_finish_ack'
            LEFT JOIN p_ticket1_ticket ON p_ticket1_ticket.t_id = p_ticket1_last_row.t_id
            WHERE p_ticket1_m_site_data.m_status =1

如果我想统计ticket1、ticket2、ticket3 的所有站点总数,我应该怎么做?

请帮帮我,谢谢。 . .

使用 UNION ALL 的示例:

我只是在上面的代码中为ticket1 和ticket2 使用了UNION ALL,但这不是我想要的。 我的期望输出是统计所有的票表,所以视图是tot_sites(来自所有票)、totdays_target(来自所有票)、todays_achieve(来自所有票)和tot_in(来自所有票)

【问题讨论】:

  • 是否适用相同的条件 - p_ticket1_ticket.t_status =9 ,p_ticket1_last_row.t_req_type = '04_int_finish_ack', p_ticket1_m_site_data.m_status =1(显然对 2 和 3 稍作修改)?
  • 是的,这将是相同的@P.Salmon
  • 你用的是什么版本的mysql?
  • Mysql 5.5.41 @P.Salmon

标签: mysql sql database database-design count


【解决方案1】:

如果你确定你的表有相同的列,你应该使用 UNION ALL 和 CTE

WITH CTE AS (

SELECT *
FROM p_ticket1_m_site_data
UNION ALL 
SELECT *
FROM p_ticket2_m_site_data
UNION ALL
...

)
SELECT COUNT(*), ...
FROM CTE
WHERE CTE.m_status = 1

CTE UNION ALL

【讨论】:

  • 如果 op 是 8 或更高版本。
  • 我不明白,你能告诉我细节吗? @Arnaud Peralta
  • UNION ALL 是一个运算符,如果两个表具有相同的列(即您的情况),则该运算符会粘贴数据。因此,CTE(带有 WITH 的子句)正在创建一个表实例,所有表都在其中。最终的 SELECT 是您的原始选择,但在 CTE(您的所有表)上进行
  • 我在帖子中为您提供了文档链接
  • 我仍然对用 CTE 和 Union All 人重写查询感到困惑。 @Arnauld Peralta
【解决方案2】:

您可以在子查询中合并三组表,然后在主查询中进行计数,主要是这样的

SELECT COUNT( * ) AS tot_sites, IFNULL( COUNT( 
            CASE WHEN m_date_target = DATE( NOW( ) ) 
             THEN 1 
            ELSE NULL 
            END ),0) AS todays_target, IFNULL( COUNT( 
            CASE WHEN (m_date_target = DATE( NOW( ) ) 
            AND t_status =9 ) 
             THEN 1 
            ELSE NULL 
            END ),0
            ) AS todays_achieve, IFNULL( COUNT( 
            CASE WHEN t_status =9
             THEN 1 
            ELSE NULL 
            END ),0 ) AS tot_in
from
(
select * 
FROM p_ticket1_m_site_data
LEFT JOIN p_ticket1_last_row ON p_ticket1_last_row.t_m_id = p_ticket1_m_site_data.m_id
     AND p_ticket1_last_row.t_req_type = '04_int_finish_ack'
LEFT JOIN p_ticket1_ticket ON p_ticket1_ticket.t_id = p_ticket1_last_row.t_id
WHERE p_ticket1_m_site_data.m_status =1
union all
select * 
frOM p_ticket2_m_site_data
LEFT JOIN p_ticket2_last_row ON p_ticket2_last_row.t_m_id = p_ticket2_m_site_data.m_id
AND p_ticket2_last_row.t_req_type = '04_int_finish_ack'
LEFT JOIN p_ticket2_ticket ON p_ticket2_ticket.t_id = p_ticket2_last_row.t_id
WHERE p_ticket2_m_site_data.m_status =1
union all
select * 
fROM p_ticket3_m_site_data
LEFT JOIN p_ticket3_last_row ON p_ticket3_last_row.t_m_id = p_ticket3_m_site_data.m_id
AND p_ticket3_last_row.t_req_type = '04_int_finish_ack'
LEFT JOIN p_ticket3_ticket ON p_ticket3_ticket.t_id = p_ticket3_last_row.t_id
WHERE p_ticket3_m_site_data.m_status =1
) j;

可以整理一下。如果这对您不起作用,请将您的 3 个表格的示例数据和预期输出作为文本添加到问题中,我会进行审核。

【讨论】:

  • 它不起作用 man @P.Salmon 弹出错误“每个派生表必须有自己的别名”。
  • 你没有复制我怀疑的全部内容。派生表确实有一个别名 J.BTW,我在 frommed 上进行了编辑以解决这个问题。
  • 我已经添加了我的期望输出,以及到目前为止我尝试过的内容
  • 好吧,我的坏先生,但是给定的错误“重复列名't_id'”怎么样?
  • 我对乒乓球毫无希望 - 通过将您的 3 个表格的示例数据作为文本添加到问题中,让我们双方都轻松。 - 不必多到足以证明答案。
猜你喜欢
  • 2019-07-08
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
相关资源
最近更新 更多