在一个查询中从表中获取计数和日期,并从另一个表中获取计数和日期

问题描述 投票:0回答:1

我有一个查询从表中获取计数和日期。 看起来像这样:

SELECT 
 date(`date`) as 'Date'
 , sb.`send_id`
 , count(`id`) as 'SUBS' 
FROM `table1`
WHERE `date` BETWEEN '2024-09-01%' AND '2024-09-30%'
GROUP BY date(`date`), `send_id`;

这让我得到如下所示的结果:

|    DATE    |   SEND_ID    |   SUBS    |
-----------------------------------------
| 2024-09-01 |  1111111     |    1900   | 
| 2024-09-01 |  2222222     |    1835   | 
| 2024-09-02 |  1111111     |    264    | 
| 2024-09-02 |  2222222     |    26     | 
-----------------------------------------

我有第二个查询,如下所示:

SELECT 
  date(`o_date`)
  , `o_send_id`
  , count(`id`) AS 'UNI'
FROM `table2`
WHERE `o_date` BETWEEN '2024-09-01%' AND '2024-09-30%'
GROUP BY date(`o_date`), `o_send_id`;

这让我得到如下所示的结果:

|    O_DATE    |   O_SEND_ID    |   UNITS  |
--------------------------------------------
| 2024-09-01   |    1111111     |    107   | 
| 2024-09-01   |    2222222     |    360   | 
| 2024-09-02   |    1111111     |    223   | 
| 2024-09-02   |    2222222     |    209   | 
--------------------------------------------    

我想做的是加入这些表以显示 SUB 和 UNITS。

所以结果看起来像这样:

|    DATE    |   SEND_ID    |   SUBS    |   UNITS |
---------------------------------------------------
| 2024-09-01 |  1111111     |    1900   |   107   |
| 2024-09-01 |  2222222     |    1835   |   360   |
| 2024-09-02 |  1111111     |    264    |   223   |
| 2024-09-02 |  2222222     |    26     |   209   |
---------------------------------------------------

这是我在单个日期加入表格的尝试:

SELECT 
  date(tb1.`date`) as 'Date'
  , tb1.`send_id`
  , count(tb1.`id`) as 'SUBS' 
  , count(tb2.`id`) as 'UNITS'
FROM `table1` tb1
JOIN `table2` tb2 ON tb2.`o_send_id` = tb1.`send_id` AND tb2.`o_date` = tb1.`date`
WHERE (tb1.`date` BETWEEN '2024-09-01%' AND '2024-09-30%')
GROUP BY date(tb1.`date`), tb1.`send_id`;

它运行了一会儿,但最终崩溃了。 我假设这是因为有相当多的记录(数百万)。 我收到一条错误消息:

Error in processing request
Error code: 500
Error text: Internal Error (rejected)
It seems that the connection to server has been lost.
Please check your network connectivity and server status.

所以我尝试运行相同的查询,但这次只使用 1 个日期和 1 个 send_id,如下所示:

SELECT 
  date(tb1.`date`) as 'Date'
  , tb1.`send_id`
  , count(tb1.`id`) as 'SUBS' 
  , count(tb2.`id`) as 'UNITS'
FROM `table1` tb1
JOIN `table2` tb2 ON tb2.`o_send_id` = tb1.`send_id` AND tb2.`o_date` = tb1.`date`
WHERE (tb1.`date` LIKE '2024-09-30%') AND tb1.`send_id` = '1111111'
GROUP BY date(tb1.`date`), tb1.`send_id`;    

此查询运行,但我得到的结果如下所示:

|    DATE    |   SEND_ID    |   SUBS     |   UNITS   |
------------------------------------------------------
| 2024-09-30 |  1111111     |    35960   |   35960   |
------------------------------------------------------

当查询成功运行时,我不确定 SUBS 和 UNITS 发生了什么,因为它们带有相同的 36960 结果。 总数应该不同,而且不可能那么高。

不知道我做错了什么。

在我之前问的问题中,有人建议我发布表格描述。

这是表1的描述:

| Field   |   Type        | Null | Key  | Default |         Extra       |
-------------------------------------------------------------------------
| id      | int(11)       |  NO  |  PRI |  NULL   |  AUTO_INCREMENT     |  
| send_id | varchar(255)  |  YES |      |  NULL   |                     |   
| date    | datetime      |  YES |      |  NULL   |                     |
-------------------------------------------------------------------------

这是表2的描述:

| Field     |   Type        | Null | Key  | Default |         Extra       |
---------------------------------------------------------------------------
| id        | int(11)       |  NO  |  PRI |  NULL   |  AUTO_INCREMENT     |  
| o_send_id | varchar(255)  |  YES |      |  NULL   |                     |    
| o_date    | datetime      |  YES |      |  NULL   |                     |
---------------------------------------------------------------------------  

每张表的描述没有什么特别的。

综上所述,请帮助我弄清楚如何在同一查询中显示 SUBS 计数和 UNIT 计数。

谢谢你。

mysql
1个回答
0
投票

(send_id, date)
((date(date)), send_id)
上的复合索引可能会提高所有查询的性能。


您可以加入分组查询,而不是加入表。

注意:您不需要在日期查询中添加 %,MySQL 可能会忽略它。请按照文档中的建议将其显式转换为

date

with table1_count as ( SELECT date(`date`) as 'Date' , sb.`send_id` , count(`id`) as 'SUBS' FROM `table1` WHERE `date` BETWEEN date('2024-09-01') AND date('2024-09-30') GROUP BY date(`date`), `send_id`; ), table2_count as ( SELECT date(`o_date`) as 'Date' , `o_send_id` , count(`id`) AS 'UNI' FROM `table2` WHERE `o_date` BETWEEN date('2024-09-01') AND date('2024-09-30') GROUP BY date(`o_date`), `o_send_id` ) select t1c.date, t1c.send_id, t1c.subs, t2c.uni from table1_count t1c left join table2_count t2c on t1c.date = t2c.date and t1c.send_id = t2c.o_send_id order by t1c.date, t1c.subs
此方法的缺点是,如果表 1 中缺少任何日期,但在表 2 中,它们将不会出现在查询中。

© www.soinside.com 2019 - 2024. All rights reserved.