MySQL Contando Registros com Múltiplas Condições

SELECT COUNT(id) AS count_total
     , SUM(IF(message = 'content1',1,0)) AS count_message1
     , SUM(CASE 
              WHEN message LIKE 'content1' THEN 1 ELSE 0
           END) AS count_message1a
FROM mytable;

Sempre que precisamos observar e analisar dados podemos fazer uso de comandos mais avançados de SQL.

É claro que este meu exemplo está longe de ser um SQL complexo, mas sempre é bom deixar registrado as possibilidades a partir de um ponto simples também.

Neste caso estou fazendo uma contagem total de registros da tabela com o COUNT(id) simples, como nenhuma condição foi posta no WHERE serão contados todos os registros.

Então quero comparar lado a lado este total de registros com o total de mensagens do tipo 1. Para obter esta contagem parcial precisamos combinar o SUM() com um IF() interno condicionando a contagem apenas para as mensagens com o conteúdo que combinem com o que eu quero.

Opcionalmente ao IF() podemos utilizar a instrução CASE(); o resultado será o mesmo, apenas estamos utilizando uma sintaxe diferente.

É claro que a instrução CASE() vai ter melhor aplicabilidade em determinadas situações, assim como o IF() também tem sua aplicação para funcionalidades de menor complexidade.

Fica a seu critério qual sintaxe aplicar; este é só o ponta-pé inicial na utilização de SQL para análise de dados.

Souriez s’il vous plait!

MySQL Resetar Sequência AutoIncrement Sem Informar Próxima Sequência

-- first, remove auto-increment attribute if it still exists
ALTER TABLE `mytable` MODIFY COLUMN `id` INT(10) UNSIGNED;

-- second, add auto-increment attribute back
ALTER TABLE `mytable` MODIFY COLUMN `id` INT(10) UNSIGNED AUTO_INCREMENT;

Recentemente enfrentei um problema de deixar os cabelos em pé onde uma das tabelas acabou perdendo o atributo auto-increment durante uma operação de movimentação na nuvem.

Bom, o deixar os cabelos em pé foi por que demorei muito para descobrir a ocorrência deste evento de perda do atributo, porém a correção do schema é bastante simples.

Apesar do meu caso se tratar de uma tabela de pouca movimentação eu quis utilizar uma solução que encontrei durante minhas buscas. Achei esta solução bastante interessante pelo fato de não ser preciso atribuir o valor do auto-increment com um HARD SET utilizando o MAX VALUE da coluna id correntemente na tabela.

Ao invés disto, a operação consiste em remover o atributo auto-increment do campo e simplesmente adicioná-lo novamente. Durante esta operação o MySQL realiza um auto-reset atribuindo o valor correto de acordo com os dados existentes na tabela.

No meu caso o atributo auto-increment já tinha sido removido em outra operação, então foi só executar o segundo comando mesmo para adicionar o auto-increment de volta a coluna id.

Caso você queira simplesmente resetar a sequência auto-increment utilizando os comandos mais tradicionais você poderia utilizar, por exemplo, os comandos abaixo.

SELECT MAX(id)+1 INTO @next_id FROM `mytable`;

ALTER TABLE `mytable` AUTO_INCREMENT = @next_id;

Prontinho… Case Closed!