Passei por uma situação hoje e gostaria de compartilhá-la. Precisava fazer uma consulta em vários bancos no MySQL para me trazer uma listagem. Porém eu presisava, para poder paginar, saber quantos registros ao todo haviam.
Ao usar o UNION eu conseguia trazer os dados, mas se eu tentasse contar os registros a seguinte consulta me trazia o seguinte resultado:
SELECT COUNT(id) AS N FROM a.table UNION SELECT COUNT(id) AS N FROM b.table UNION SELECT COUNT(id) AS N FROM c.table
O Resultado foi o seguinte:
| N |
|---|
| 75 |
| 23 |
| 12 |
O problema é que o resultado esperado é 110 registros. Para otimizar esta consulta, fui atrás de informações na internet e encontrei a seguinte solução:
SELECT ((SELECT COUNT(id) AS N FROM a.table) +
(SELECT COUNT(id) AS N FROM b.table) +
(SELECT COUNT(id) AS N FROM c.table)) AS N
A consulta enfim retornou meus 110 registros, como esperado. Mas a solução parece um pouco com uma gambiarra. Depois de consultas com o meu colega de trabalho (e chefe) chegamos a seguinte consulta:
SELECT COUNT(id) AS N FROM ( SELECT id AS N FROM a.table UNION SELECT id AS N FROM b.table UNION SELECT id AS N FROM c.table ) AS TABLE
É uma forma mais elegante e otimizada. Ao invés de fazer N processos de COUNT, é feito apenas um. E isso reduz carga no processador do servidor.
Fica aí a dica para quem passou (ou passa) por problema parecido…