Jump to content
AntonioGraca

Apresentar o resultado de vários COUNT com valores ordenados

Recommended Posts

AntonioGraca

Olá

Gostava de fazer um SUM dos COUNT de 3 tabelas e apresentar os dados por ordem, ou seja, nas tres tabelas há um campo que é comum cf_user_id, e eu quero somar o total de registos daquele user (65) de cada tabela.

Estava a tentar fazer sem o join, pareceu-se que seria possivel mas está  a dar erro

SOMAR treinos

SELECT COUNT( * ) AS treinos
FROM  `apo_chronoforms_data_treinos_registo`
WHERE  `cf_user_id` =65

SOMAR marcas

SELECT COUNT( * ) AS marcas
FROM  `apo_chronoforms_data_marcas_registo`
WHERE  `cf_user_id` =65

SOMAR testes

SELECT COUNT( * ) AS testes
FROM  `apo_chronoforms_data_testes_registo`
WHERE  `cf_user_id` =65

E Ordenar pelo maior valor

Alguém me sabe dizer se é possível fazer sem o JOIN e como?

António Graça


Olá, mais uma vez

Se não der sem JOIN, pergunto como somar os 3 valores (Total_marcas, Total_treinos e Total_testes) numa única variável para depois fazer o ORDER BY pela mesma?

SELECT  `USER`.id AS user_id,  `USER`.name AS User_name, MARCAS.TOTAL AS Total_Marcas, TREINOS.TOTAL AS Total_Treinos, TESTES.TOTAL AS Total_Testes
FROM apo_users AS  `USER`
LEFT JOIN (
SELECT cf_user_id, COUNT( cf_user_id ) AS TOTAL
FROM apo_chronoforms_data_marcas_registo
GROUP BY cf_user_id
) AS MARCAS ON  `USER`.id = MARCAS.cf_user_id
LEFT JOIN (
SELECT cf_user_id, COUNT( cf_user_id ) AS TOTAL
FROM apo_chronoforms_data_treinos_registo
GROUP BY cf_user_id
) AS TREINOS ON  `USER`.id = TREINOS.cf_user_id
LEFT JOIN (
SELECT cf_user_id, COUNT( cf_user_id ) AS TOTAL
FROM apo_chronoforms_data_avaliacao_registo
GROUP BY cf_user_id
) AS TESTES ON  `USER`.id = TESTES.cf_user_id
WHERE MARCAS.TOTAL IS NOT NULL
OR TREINOS.TOTAL IS NOT NULL
OR TESTES.TOTAL IS NOT NULL

António Graça

Edited by brunoais
geshi corrigido. 2x post junto.

Share this post


Link to post
Share on other sites
AntonioGraca

Obrigado, N3lson.

Mas o meu problema não é a função SUM de forma isolada, é SUM de vários COUNT e ordenar a pesquisa pelo valor da variável que resultou do SUM.

:confused:

António Graça

Share this post


Link to post
Share on other sites
HappyHippyHippo
select *
 from (select 'treinos' as tipo,
              count(*) as quantidade
         from `apo_chronoforms_data_treinos_registo`
        where `cf_user_id` = 65
        union
       select 'marcas',
              count(*)
         from `apo_chronoforms_data_marcas_registo`
        where `cf_user_id` = 65
        union
       select 'testes',
              count(*)
         from `apo_chronoforms_data_testes_registo`
        where `cf_user_id` = 65
      ) as tbl
order by quantidade asc

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
AntonioGraca

Obrigado, HHH

Mas algo está a dar o prefixo do nome da BD a uma das tabelas. O SQL retorna este erro:

#1146 - Table 'infortr_apoio.apo_chronoforms_data_testes_registo' doesn't exist

A tabela que existe é apo_chronoforms_data_testes_registo e não 'infortr_apoio.apo_chronoforms_data_testes_registo'

Tentei mas não consegui ver o que está mal..

Obrigado,

António Graça

Share this post


Link to post
Share on other sites
HappyHippyHippo

tens a certeza que a tabela apo_chronoforms_data_testes_registo existe mesmo ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
AntonioGraca

HHH, Dsc, dsc, dsc!

Tens razão. Tenha mudado o nome à tabela e já se me tinha varrido.

Funciona, mas uma vez , obrigado.

António Graça

Share this post


Link to post
Share on other sites
AntonioGraca

Afinal, estou aqui mais uma vez... :(

Fiquei "cego" ao ver que não dava erro que não reparei que o resultado final não é exatamente aquele que eu pretendia... Ou seja, não está a somar os três valores numa única variável, estão a aparecer três COUNT's e não o valor do SUM dos três COUNT´s.

E há mais uma coisa (aqui a falha é minha), afinal não me interessa pesquisar por um determinado User, mas sim, pesquisar todos os user. Aqueles que tiverem dados (em qualquer das tabelas), o código somava. :confused: Repara agora o que pretendia como ponto de partida...

pergunto como somar os 3 valores (Total_marcas, Total_treinos e Total_testes) numa única variável para depois fazer o ORDER BY
SUM dos COUNT de 3 tabelas e apresentar os dados por ordem, ou seja, nas tres tabelas há um campo que é comum cf_user_id, e eu quero somar o total de registos daquele user (65) de cada tabela.

A única diferença é que verifico que não me interessa pesquisar por um determinado user mas sim fazer a listagem de todos com os dados (das 3 tabelas) somados

António Graça

Edited by AntonioGraca

Share this post


Link to post
Share on other sites
HappyHippyHippo
select `cf_user_id`,
      sum(quantidade) as quantidade
 from (select 'treinos' as tipo,
              `cf_user_id`,
              count(*) as quantidade
         from `apo_chronoforms_data_treinos_registo`
     group by `cf_user_id`
        union
       select 'marcas',
              `cf_user_id`,
              count(*)
         from `apo_chronoforms_data_marcas_registo`
     group by `cf_user_id`
        union
       select 'testes',
              `cf_user_id`,
              count(*)
         from `apo_chronoforms_data_testes_registo`
     group by `cf_user_id`
      ) as tbl
group by `cf_user_id`
order by quantidade asc


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.