Tenho uma consulta que obtém uma contagem e uma data de uma tabela. Parece com isso:
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`;
Isso me dá resultados parecidos com estes:
| DATE | SEND_ID | SUBS |
-----------------------------------------
| 2024-09-01 | 1111111 | 1900 |
| 2024-09-01 | 2222222 | 1835 |
| 2024-09-02 | 1111111 | 264 |
| 2024-09-02 | 2222222 | 26 |
-----------------------------------------
Tenho uma segunda consulta que se parece com esta:
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`;
Isso me dá resultados parecidos com estes:
| 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 |
--------------------------------------------
O que estou tentando fazer é JUNTAR essas tabelas para exibir SUB e UNIDADES.
Então os resultados seriam mais ou menos assim:
| 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 |
---------------------------------------------------
Aqui está minha tentativa de JUNTAR as tabelas em uma única data:
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`;
Ele roda um pouco, mas eventualmente trava. Estou supondo que seja porque há muitos registros (na casa dos milhões). Recebo um erro que diz:
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.
Então tentei executar a mesma consulta, mas desta vez usei apenas 1 data e 1 send_id, assim:
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`;
Esta consulta é executada, mas obtenho um resultado parecido com este:
| DATE | SEND_ID | SUBS | UNITS |
------------------------------------------------------
| 2024-09-30 | 1111111 | 35960 | 35960 |
------------------------------------------------------
Enquanto a consulta foi executada com sucesso, não tenho certeza do que aconteceu com SUBS e UNITS, pois eles chegaram com o mesmo resultado 36960. Os totais devem ser diferentes, e de jeito nenhum devem ser tão altos.
Não tenho certeza do que fiz de errado.
Em uma pergunta anterior que fiz, alguém sugeriu que eu postasse a descrição da tabela.
Aqui está a descrição da tabela 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 | |
-------------------------------------------------------------------------
E aqui está a descrição da tabela2:
| 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 | |
---------------------------------------------------------------------------
Nada de especial nas descrições de cada mesa.
Dito isso, ajude-me a descobrir como posso fazer com que a contagem de SUBS e UNIT seja exibida na mesma consulta.
Os índices da tabela 1 estão abaixo.
E aqui estão os índices da tabela2.
Estou usando apenas o ID.
Você pode juntar suas 2 consultas como
Se
date
ouo_send_id
existir em uma saída de subconsulta e não existir em outra, você poderá perder linhas.Atualização 1:
Caso mais confiável
Atualização 2:
No primeiro exemplo, perdemos date=2024-09-11' e send_id=104
violino
Um índice composto em
(send_id, date)
ou talvez((date(date)), send_id)
provavelmente melhoraria o desempenho de todas as suas consultas.Em vez de juntar as tabelas, você pode juntar suas consultas agrupadas.
Nota: Você não precisa adicionar um % a uma consulta entre datas, o MySQL provavelmente está ignorando isso. Faça o cast explicitamente
date
como recomendado na documentação .A desvantagem dessa abordagem é que se algum dia estiver faltando na tabela1, mas estiver na tabela2, ele não aparecerá na consulta.
Como você está no MySQL 5.7, que não tem
with
, elas podem ser reescritas usando subconsultas.