Ir para conteúdo
Fórum Script Brasil

Denis Courcy

Moderadores
  • Total de itens

    3.089
  • Registro em

  • Última visita

Tudo que Denis Courcy postou

  1. Faça assim: SELECT tbCidades.nome AS Cidade, tbFiliais.nome AS Filial, tbProdutos.nome AS NomeProduto, SUM(IF(tbVendas.formapgto "C", 1,0)) AS VendasCartao, SUM(IF(tbVendas.formapgto "D", 1,0)) AS VendasDinheiro, SUM(IF(tbVendas.formapgto IN ('C',"D"), 1,0)) AS VendasTotal FROM cidades tbCidades INNER JOIN filiais tbFiliais ON tbFiliais.idCidade = tbCidades.idCidade INNER JOIN produtos tbProdutos ON tbProdutos.idFilial = tbFilial.idFilial INNER JOIN vendas tbVendas ON tbProdutos.idProduto = tbVendas.idProduto WHERE tbCidades.nome='Rio de Janeiro' AND tbFiliais.nome='Copacabana' AND tbVendas.data='15/11/2017' GROUP BY Cidade, Filial, NomeProduto
  2. Experimente passar o campo para BIGINT NOT NULL AUTO_INCREMENT. Se suas tabelas não passarem de 63 bits (9223372036854775807) você pode usar UNSIGNED. Senão, utilize sem esta opção.
  3. Denis Courcy

    Busca composta

    Tente assim: SELECT * FROM tabela WHERE campo LIKE 'auto%eletrica%'
  4. Abaixo segue um exemplo de uma storage procedure que uso em meus sistemas: DELIMITER $$ USE `meubancodedados`$$ DROP PROCEDURE IF EXISTS `minhaprocedure_crud`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `minhaprocedure_crud`(IN Acao CHAR(1), IN pidCampo INTEGER, IN pnmCampo VARCHAR(50), IN pidUsuarioRespInclusao INTEGER, IN pidUsuarioRespAlteracao INTEGER) BEGIN DECLARE msg VARCHAR(1000) DEFAULT "MySQL: Sem mensagem"; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; IF pnmCampo = "" OR (Acao <> "I" AND pidCampo = 0) THEN SET msg = "MySQL: Erro na passagem de parametros"; ELSE START TRANSACTION; /*Inclusao*/ IF Acao = "I" THEN INSERT INTO minhaTabela(nmCampo, idUsuarioRespInclusao, dhInclusaoInformacao) VALUES (pnmCampo, pidUsuarioRespInclusao, NOW()); IF excecao = 1 THEN SET msg = "MySQL: Erro ao inserir na tabela de minhaTabela"; ROLLBACK; END IF; END IF; IF excecao <> 1 THEN IF Acao <> "I" THEN SET @idCampo = pidCampo; END IF; /*Alteracao*/ IF Acao = "A" THEN UPDATE minhaTabela SET nmCampo = pnmCampo, idUsuarioRespAlteracao = pidUsuarioRespAlteracao WHERE idCampo = @idCampo; IF excecao = 1 THEN SET msg = "MySQL: Erro ao atualizar minhaTabela"; ROLLBACK; END IF; END IF; END IF; /*Exclusao*/ IF excecao <> 1 THEN IF Acao = "E" THEN DELETE FROM minhaTabela WHERE idCampo = @idCampo; IF excecao = 1 THEN SET msg = "MySQL: Erro ao excluir minhaTabela"; ROLLBACK; END IF; END IF; END IF; /*Se tudo deu certo, então finaliza confirmando a gravacao.*/ IF excecao <> 1 THEN COMMIT; IF Acao = "I" THEN SET msg = "MySQL: minhaTabela Incluido com sucesso"; ELSE IF Acao = "A" THEN SET msg = "MySQL: minhaTabela Alterado com sucesso"; ELSE SET msg = "MySQL: minhaTabela Excluido com sucesso"; END IF; END IF; END IF; END IF; SELECT msg AS msg; END$$ DELIMITER ;
  5. Utilize chave primária somente para ligar uma tabela a outra. Campo integer unsigned not null auto_increment, resolve o problema de chave primária com auto sequenciamento.
  6. Procure no manual do mysql a função DATE_ADD DATE_ADD(CURDATE(), INTERVAL 30 DAY) ou DATE_ADD(CURDATE(), INTERVAL 1 MONTH)
  7. Denis Courcy

    COMANDOS MYSQL

    O manual do MySQL na versão 4 está em português e servirá para seu propósito. https://downloads.mysql.com/docs/refman-4.1-pt.pdf Qual quer dúvida poste aqui e te ajudarei
  8. Denis Courcy

    Trigger

    Fazendo desta forma (usando função na representação de um campo e comparando-o com um literal) você corre um grande risco de que sua busca vire um TABLE SCAN, ou seja ela não usará índices e poderá demorar muito. Eu substituiria a função pelo LIKE e, melhor ainda, pelo BETWEEN . Exemplo: SELECT * FROM `suatabela` WHERE `data` LIKE "2017-09%"; ou SELECT * FROM `suatabela` WHERE `data` BETWEEN "2017-09-01" AND "2017-09-30"; Desta forma você aproveitará todo o potencial de seus índices.
  9. Faça assim: SELECT * FROM cliente WHERE nome LIKE 'josé%' AND nome LIKE '%xavier'
  10. SQL_MODE é a variável que informa como a sintaxe SQL será tratada. Qual o comportamento que ela terá Para mais detalhes leia https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html
  11. Tente assim: DELIMITER $ DROP PROCEDURE CRIAR_CONSULTA$ CREATE PROCEDURE CRIAR_CONSULTA(IN IDPAC INT, IN IDMED INT, IN IDHOS INT) BEGIN DECLARE msg VARCHAR(200) DEFAULT ''; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; start transaction; if (IDPAC > 0 AND IDMED > 0 AND IDHOS > 0) THEN INSERT INTO CONSULTA (IDCONSULTA, ID_PACIENTE, ID_MEDICO, ID_HOSPITAL, DATA) VALUES(NULL, IDPAC, IDMED, IDHOS, CURTIME()); IF excecao = 1 THEN SET msg = "Erro ao inserir na tabela usuario" AS Msg; ROLLBACK; END IF; ELSE SET excecao =1; SET msg = 'INSIRA OS DADOS CORRETAMENTE'; ROLLBACK; END IF; IF excecao = 0 THEN SET msg = 'DADOS INSERIDOS COM SUCESSO'; COMMIT; END IF; SELECT msg AS mensagem; END$ DELIMITER ;
  12. Faça com 3 deletes. Assim não funcionará.
  13. Salvar em um só registro? Se você modelou corretamente a tabela de orcamento receberá os dados gerais e a de item_orcamento receberá um registro para cada item daquele orçamento. A gravação pode ocorrer de uma única vez, através de uma storage procedure com controle de sucesso ou fracasso de gravação. Passe o modelo de dados para o forum de MySQL e veremos o que pode ser feito. Depois, você poderá retornar a este forum para saber como integrar a linguagem de programação com o banco.
  14. Remova esta linha de seu código: DECLARE pcodven int; Você já declarou esta variável como parâmetro. A Redeclaração como variável ordinária anula os dados vindos como parâmetro e o select perde o valor que deveria ser usado na cláusula where
  15. Movendo para o forum de PHP
  16. Movendo para o forum de PHP
  17. Faça assim: CREATE DEFINER=`root`@`localhost` PROCEDURE `verificapagamento`(IN pinfcodigo INT, IN ppagcodigo INT, IN pvencodigo INT, IN pvalor DOUBLE) BEGIN DECLARE valorvenda DOUBLE; DECLARE somavalores DOUBLE; DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem"; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; SELECT venvalortotal INTO valorvenda FROM venda WHERE vencodigo = pvencodigo; SELECT COALESCE(SUM(valor),0) INTO somavalores FROM informaformapgto WHERE vencodigo = pvencodigo; IF somavalores > valorvenda THEN SET mensagem = "Valor não confere"; SELECT mensagem AS msg; ELSE START TRANSACTION; INSERT INTO informaformapgto(infcodigo, pagcodigo, vencodigo, valor) VALUES (pinfcodigo, ppagcodigo, pvencodigo, pvalor); IF excecao = 1 THEN SET mensagem = "Erro na gravação"; ROLLBACK; ELSE SET mensagem = "Gravado com sucesso"; COMMIT; END; SELECT mensagem AS msg; END IF; END Não testei o código. Por favor informe o resultado.
  18. Movendo para o forum de PHP
  19. em insert into pedido_detalhe (270,1,1); O correto seria insert into pedido_detalhe (valor, curso, pedido) values (270,1,1);
  20. Denis Courcy

    Reinstação MySQL

    Tente restaurar usando o prompt de comando. digite mysql -uroot -p; informe a senha em mysql> digite source info16br; aguarde a restauração digite quit para encerrar o mysql
  21. Proceda usando LIKE '%expressão1%expressao2%' ou mudando a forma de busca. Em vez de usar o LIKE, que da forma que você quer vai entrar em TABLE SCAN, use indexação por FULLTEXT. Com FULLTEXT você conseguirá fazer a pesquisa do jeito que você quer e deforma mais eficaz. Até a versão 5.6 o FULLTEXT só funcionava com engine MyISAM. A partir da versão 5.6 ele passou a funcionar em tabelas INNODB. https://pt.blog.marceloaltmann.com/en-using-the-mysql-fulltext-index-search-pt-utilizando-mysql-fulltext/ Leia sobre FULLTEXT no manual de sua versão do MySQL.
×
×
  • Criar Novo...