我有一个查询从表中获取计数和日期。 看起来像这样:
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 计数。
谢谢你。
(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 中,它们将不会出现在查询中。