Pergunta

SELECT
  ( SELECT
       SUM(IF(status = 'Active', 1, 0)) AS `univ_active`,
       SUM(IF(status = 'Inactive', 1, 0)) AS 'univ_inactive',
       Count(*)
    FROM online_university
  ) 
 AS tot_university,
( SELECT 
    SUM(IF(status = 'Active', 1,0)) AS `user_active`,
    SUM(IF(status = 'Inactive', 1,0)) AS 'user_inactive'
    Count(*)
  FROM online_register_user)
AS tot_users

O resultado deve ser

univ_active=4 univ_inactive=2 tot_university=6
user_active=10 user_inactive=3 tot_users = 13

Como posso conseguir isso? O erro de retorno da consulta acima: Operando deve conter 1 (s) coluna (s)

Isso para preparar o relatório para um projeto de todas as tabelas que retornam registros totais ativos, inativos e da tabela. Se esse método estiver errado, o que devo usar? Alguma sugestão.

Foi útil?

Solução

As subconsações podem retornar apenas uma coluna. Você precisa fazer várias subconsivas, uma junção ou um hack de concat barato (CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0))) em uma única subconeração.

Outras dicas

Como o erro diz, você está selecionando uma subconsulta que retorna duas colunas.

SELECT (one_thing, another_thing) AS combined_thing

Não existe no SQL. Você teria que colocar cada subconsiva por conta própria:

SELECT (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_university
) AS univ_active, (
    SELECT SUM(IF(status='Inactive', 1, 0)) FROM online_university
) AS univ_inactive, (
    SELECT SUM(IF(status='Active' OR status='Inactive', 1, 0)) FROM online_university
) AS tot_university, (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_register_user
) AS user_active, (
    -- and so on

No entanto, realmente não há benefício em fazer tudo isso em uma única consulta. Muito mais fácil de dizer:

SELECT COUNT(*) FROM online_university WHERE status='Active';  -- univ_active
SELECT COUNT(*) FROM online_university WHERE status='Inactive';  -- univ_inactive
SELECT COUNT(*) FROM online_university;  -- tot_university
SELECT COUNT(*) FROM online_register_user WHERE status='Active';  -- user_active
    -- and so on

Em seguida, apresente esses resultados juntos na camada de aplicação. A cláusula onde é mais rápido e pode usar índices adequados que uma expressão calculada como soma/se não pode.

Ainda mais simples:

SELECT status, COUNT(*) FROM online_university GROUP BY status;
SELECT status, COUNT(*) FROM online_register_user GROUP BY status;

Como o BipedalShark disse, suas consultas devem ter 1 coluna e elas têm 2 agora. Mas, além disso, você deve pensar em usar a contagem (*) e onde cláusula. Portanto, deve ser o mesmo:

select
 (select count(*) from online_university where status = 'Active') as univ_active,
 (select count(*) from online_university where status = 'Inactive') as univ_inactive,
 (select count(*) from online_register_user where status = 'Active') as user_active,
 (select count(*) from online_register_user where status = 'Active') as user_inactive

Ao layout a consulta, como eu fiz na pergunta, fica muito óbvio que o alias tot_University, por exemplo, estaria associado a duas colunas, o que não é possível ...

Além desse erro de sintaxe/lógica, toda a consulta parece pouco estruturada para produzir o resultado desejado.

Parece muito com a lição de casa, ou aprendizado auto-designado, por isso não vou estragá-lo com uma consulta pronta, em vez disso, aqui estão algumas dicas.

  • A informação vem de duas tabelas distintas e não relacionadas, talvez use a união para obter resultados em uma única consulta (enquanto executa efetivamente duas consultas) (você usaria uma coluna extra com algum texto como 'Univ', 'público' para diferenciar os dois linhas)
  • A soma (se coluna = x, 1,0) é um bom truque para contar valores específicos, sem precisar fazer um grupo, essencialmente "rolando" as contagens em uma etapa.
  • O truque concat () é bom se o seu foco estiver exclusivamente nos resultados do tipo textual, por exemplo, para escrever, como está, em um relatório, caso contrário, seria preferível manter os resultados em colunas separadas, para processamento adicional, exibição em exibição em mesas etc ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top