Estou escrevendo um script que obtém uma contagem de linhas para algumas tabelas, no entanto, para algumas tabelas, quero obter apenas uma contagem de linhas onde um sinalizador está definido (neste caso, ativo = 1). Existe uma maneira de fazer isso em uma consulta?
Por exemplo:
A tabela users
tem uma coluna chamada ativa
A tabela clients
não possui uma coluna chamada ativa
Eu quero obter uma contagem de usuários onde ativo = 1 e apenas obter uma contagem de clientes.
Antes de dizer "apenas codificar", esta é uma consulta que está dentro de um script python que pode ser executado em vários bancos de dados diferentes e não tenho como saber quais tabelas meu script selecionará e se elas têm uma coluna chamada active
, e Eu preferiria ter apenas uma consulta para fazer tudo, em vez de duas separadas e depender do mysql para gerar um erro, para que eu saiba usar a outra.
Meu primeiro pensamento seria usar o
INFORMATION_SCHEMA
primeiro, para que você saiba (em uma consulta para todas as tabelas na instância do MySQL) quais tabelas possuem umaactive
coluna e, em seguida, use essas informações para construir suas consultas. E esta é provavelmente a abordagem mais sensata.Existe uma outra maneira complicada que funciona, independentemente de a tabela ter ou não essa coluna:
Testado no SQL-Fiddle Como funciona?
Se a tabela tiver uma coluna chamada
active
, a consulta é "traduzida" como se tivesse:Se a tabela não tiver uma coluna chamada
active
, a consulta é "traduzida" como se tivesse:Contagem de clientes por UserID com total geral usando apenas a
users
tabela:Se a tabela de clientes excluiu registros, faça o seguinte:
Para
users
tabelas que não possuemactive
coluna:ou
Você precisaria executar essas consultas em cada banco de dados e
UNION ALL
nos resultados.Se você deseja aproveitar o banco de dados INFORMATION_SCHEMA, aqui está um palpite:
De uma chance !!!
Gostaria de complementar a resposta do @ypercubeᵀᴹ, mas não posso escrever comentários por causa das restrições.
Se você não sabe qual nome de coluna é usado e precisa obter seu valor máximo, pode fazer isso: