我有一个查询,它从表中获取计数和日期。它看起来像这样:
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 计数。
表 1 的索引如下。
这是表2的索引。
我只用ID。
你可以将你的两个查询合并为
如果
date
或o_send_id
在 1 个子查询输出中存在而在另一个子查询输出中不存在,则可能会丢失行。更新1:
更可靠的案例
更新2:
在第一个例子中,我们丢失了 date=2024-09-11' 和 send_id=104
小提琴
复合索引
(send_id, date)
或许((date(date)), send_id)
可能会提高所有查询的性能。您可以连接分组查询,而不是连接表。
注意:您不需要在日期间查询中添加 %,MySQL 可能会忽略它。请
date
按照文档中的建议将其明确转换为。这种方法的缺点是,如果表 1 中缺少某些天数,但表 2 中有这些天数,则它们不会出现在查询中。
由于您使用的是没有的 MySQL 5.7
with
,因此可以使用子查询重写它们。