Eu gostaria de combinar as contagens das estatísticas por diferentes hit_types em uma consulta. Isso é possível?
MariaDB [db]> select allurls.id, count(s1.id) from allurls inner join stats s1 on allurls.id = s1.allurl_id and s1.hit_type = 0 where s1.hit_date >= '2018-01-15' group by allurls.id;
+-----+--------------+
| id | count(s1.id) |
+-----+--------------+
| aaa | 1 |
| cnn | 16 |
+-----+--------------+
MariaDB [db]> select allurls.id, count(s1.id) from allurls inner join stats s1 on allurls.id = s1.allurl_id and s1.hit_type = 1 where s1.hit_date >= '2018-01-15' group by allurls.id;
+-----+--------------+
| id | count(s1.id) |
+-----+--------------+
| cnn | 1 |
+-----+--------------+
MariaDB [db]> select allurls.id, count(s1.id) from allurls inner join stats s1 on allurls.id = s1.allurl_id and s1.hit_type = 2 where s1.hit_date >= '2018-01-15' group by allurls.id;
+-----+--------------+
| id | count(s1.id) |
+-----+--------------+
| cnn | 4 |
+-----+--------------+
Tentei combinar os dois primeiros, mas os números estão todos confusos e eliminou o primeiro resultado 'aaa'.
MariaDB [db]> select allurls.id, count(s1.id), count(s2.id) from allurls inner join stats s1 on allurls.id = s1.allurl_id and s1.hit_type = 0 inner join stats s2 on allurls.id = s2.allurl_id and s2.hit_type = 1 where s1.hit_date >= '2018-01-15' and s2.hit_date >= '2018-01-15' group by allurls.id;
+-----+--------------+--------------+
| id | count(s1.id) | count(s2.id) |
+-----+--------------+--------------+
| cnn | 16 | 16 |
+-----+--------------+--------------+
eu esperava ver
+-----+--------------+--------------+
| id | count(s1.id) | count(s2.id) |
+-----+--------------+--------------+
| aaa | 1 | 0 |
| cnn | 16 | 1 |
+-----+--------------+--------------+
Em última análise, também quero incluir count(distinct(s4.source_id))
.
Aqui está um violino: https://www.db-fiddle.com/f/tGP5SbC2AdGgeEwWTAgobf/0
Não tenho certeza se há algo que sinto falta aqui, mas você pode contar condicionalmente como:
Algumas coisas a serem observadas:
Mudei
hit_type
o predicado para where, não faz diferença lógica, mas prefiro ter apenas o relacionamento entre tabelas na cláusula join se possível.distinct não é uma função,
count(distinct(s1.source_id))
é confuso. Melhor usocount(distinct s1.source_id)
Isso pode ajudar (pelo menos parcialmente):
Resultado:
O db-fiddle está disponível aqui e os números aparecem corretos na medida em que somam as contagens nas 3 primeiras consultas (individual - não
OR
). Estou dando +1 a esta pergunta por fornecer um violino - como recomendado aqui - se todos os pôsteres fizessem o mesmo (suspiro ...)Eu não vi nenhum s2, nem um s4, no violino - talvez ele precise ser expandido?
OK, encontrei uma maneira com sub-consultas (elas corrigem tudo), mas não tenho certeza se essa é a mais eficiente.