-
Total de itens
3.089 -
Registro em
-
Última visita
Tudo que Denis Courcy postou
-
Oi, André! A partir da versão 5.0 do mysql RELEASE se tornou uma palavra reservada. Como ela é o nome de um atributo de uma tabela de seu sistema, então este erro será constante. Para evitar trocar o nome do atributo escreva-o entre crases, assim: `release`. Antes de dar um nome a um banco, tabela atributo ou índice, consulte a relação de nomes reservados no manual do mysql da versão que você está usando.
-
Como você está usando o mes em portugues , não poderá usar a função DATE_FORMAT(data,formato) que seria a mais lógica. Em vez disso vamos usar um truque assim: SELECT CONCAT(DAY(minhadata), ' de ', ELT(MONTH(minhadata), 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'), ' de ', YEAR(minhadata)) FROM minhatabela; Onde minhadata é o nome do campo data que você quer usar de sua tabela e minha tabela é o nome de sua tabela
-
A mensagem é clara algo está duplicando sua chave priméria e está dando erro. Verifique a consistência da tabelas e dos índices. Índices quebrados costumam causar este tipo de erro. Lea este capítulo do manual do mysql: Prevenção de Disastres e Recuperação
-
(Resolvido) Busca SQL de tabelas esta muito lenta e trava
pergunta respondeu ao marcosfj1 de Denis Courcy em MySQL
Eu não gosto disso mas vou te responder com uma pergunta cretina: O que te impede de guardar o valor de SELECT FOUND_ROWS(); em uma variável? Não importa que número apareça nela. sempre exibirá o número máximo de linhas retornado em sua pesquisa, certo? ;) lol -
(Resolvido) Busca SQL de tabelas esta muito lenta e trava
pergunta respondeu ao marcosfj1 de Denis Courcy em MySQL
Oi 'marcosfj1', Antes de falar sobre SQL_CALC_FOUND_ROWS devemos entender uma afirmação: "O retorno de um SELECT é sempre uma tabela" Se é uma tabela, então possui um determinado número de linhas nela, certo? A cláusula SQL_CALC_FOUND_ROWS, quando colocada em uma instrução SELECT, alimentará uma variável interna do MySQL com o número total de linhas retornado por aquele select dentro da condição estabelecida. Lembra que em meu post anterior informei que a tabela original possuia 100 linhas e que minha consulta com aquele WHERE deveria retornar 60 linhas? Pois é, a claúsula SQL_CALC_FOUND_ROWS guardou a quantidade total de linhas retornadas mesmo eu pedindo para exibir somente 10. O select seguinte SELECT FOUND_ROWS(); trouxe para mim o que eu queria, o número 60 que estava em uma variável interna do MySQL. Agora eu posso controlar como as linhas serão exibidas informando a linha inicial e a linha final na cláusula LIMIT . Isto é muito bom quando estou usando páginas de internet e preciso "rolar" minha consulta. Entendeu agora? -
(Resolvido) Busca SQL de tabelas esta muito lenta e trava
pergunta respondeu ao marcosfj1 de Denis Courcy em MySQL
Creio que seu sistema não está travando. ele está "processando" lentamente por causa de TABLE SCAN. Há falta de índices em sua consulta que estão dificultando a resposta rápida. Você pode usar o limit para fazer diversas consultas (consultas parciais) que preencherão a página em grid e possibilitarão a "rolagem" destes dados. Você deverá usar a cláusula SQL_CALC_FOUND_ROWS juntamente com LIMIT e posteriormente um select para obter FOUND_ROWS() que retornará a quantidade total de linhas daquela consulta. SELECT CU.uf, CU.id_cliente_uf, CU.nome AS nome_uf, CC.nome AS nome_cidade, CC.id_cliente_uf, CC.id_cliente_cidade, SUM(PE.vl_total) AS vl_total, PE.id_cliente_endereco, PE.id_pedido_status, CE.cidade, SUM(PE.id_pedido_status) AS qtde_pedido FROM nome_tabela CU INNER JOIN nome_tabela CC ON CC.id_cliente_uf = CU.id_cliente_uf INNER JOIN nome_tabela CE ON CE.id_cliente_cidade = CC.id_cliente_cidade INNER JOIN nome_tabela PE ON PE.id_cliente_endereco = CE.id_cliente_endereco INNER JOIN nome_tabela C ON PE.id_cliente = C.id_cliente WHERE CU.id_cliente_uf = {$_POST["id_cliente_uf"]} AND PE.id_pedido_status = 'x' GROUP BY CC.id_cliente_cidade "; Em seu código acima verifique: 1) se há indice para CC.id_cliente_uf; 2) se há indice para CE.id_cliente_cidade; 3) se há indice para PE.id_cliente_endereco; 4) se há indice para C.id_cliente; 5) se há indice para CU.id_cliente_uf e PE.id_pedido_status; 6) se há indice para CC.id_cliente_cidade. SELECT CU.uf, CU.id_cliente_uf, CC.id_cliente_uf, CC.id_cliente_cidade, SUM(PE.vl_total) AS vl_total,PE.id_cliente_endereco, PE.id_pedido_status, SUM(PE.id_pedido_status) AS qtde_pedido FROM nome_tabela CU INNER JOIN nome_tabela CC ON CC.id_cliente_uf = CU.id_cliente_uf INNER JOIN nome_tabela CE ON CE.id_cliente_cidade = CC.id_cliente_cidade INNER JOIN nome_tabela PE ON PE.id_cliente_endereco = CE.id_cliente_endereco INNER JOIN nome_tabela C ON PE.id_cliente = C.id_cliente WHERE PE.id_pedido_status = 3 GROUP BY CU.uf "; Se existem os indices anteriormente relacionados verifique se há este índice: 1)CU.uf. Abaixo um exemplo de como usar o LIMIT do jeito que mencionei acima:-- Listando de dez em dez linhas SELECT SQL_CALC_FOUND_ROWS * FROM TABELA WHERE c=x LIMIT 10; -- Acima será mostrado as primeiras 10 linhas (mas minha tabela possui 100 registros e esta consulta exibiria 60 sem o limit SELECT FOUND_ROWS(); -- informa que a consulta acima possui 60 linhas -- Sabendo disso agora posso controlar meu limit para exibir as próximas 10 linhas, assim: SELECT * FROM TABELA WHERE c=x LIMIT 11,20; -
Oi, 'André - AgênciaInovar' Antes de pensar em otimizar seu server MySQL verifique se suas consultas SQL estão otimizadas.
-
Movendo MySQL -->> C, C++
-
Tente assim: SELECT COUNT(DW_Notas.Id_Contrato) AS QT_INTERNACOES FROM DW_Fato_Producao INNER JOIN DW_Notas ON DW_Fato_Producao.Competencia = DW_Notas.Competencia AND DW_Fato_Producao.Canal = DW_Notas.Canal AND DW_Fato_Producao.Lote = DW_Notas.Lote AND DW_Fato_Producao.Nota = DW_Notas.Nota AND DW_Fato_Producao.[Tipo Documento] = DW_Notas.[Tipo Documento] AND DW_Fato_Producao.[Numero Documento] = DW_Notas.[Numero Documento] GROUP BY DW_Notas.Competencia, DW_Fato_Producao.Lote, DW_Notas.[Data de Internacao], DW_Notas.Nota, DW_Notas.Id_Contrato HAVING (DW_Notas.Competencia = CONVERT(DATETIME, '2010-09-01 00:00:00', 102)) AND (DW_Notas.[Data de Internacao] <> CONVERT(DATETIME, '1900-01-01 00:00:00', 102)) AND (DW_Notas.Id_Contrato = 9400021187) Outra opção caso você precise dos dois. (O analítico e a quantidade total de registros retornados): Execute sua consulta normalmente acrescentando a cláusula SQL_CALC_FOUND_ROWS, assim: SELECT SQL_CALC_FOUND_ROWS DW_Notas.Id_Contrato AS Nota, DW_Notas.Competencia, DW_Fato_Producao.Lote, DW_Notas.[Data de Internacao], DW_Notas.Nota FROM DW_Fato_Producao INNER JOIN DW_Notas ON DW_Fato_Producao.Competencia = DW_Notas.Competencia AND DW_Fato_Producao.Canal = DW_Notas.Canal AND DW_Fato_Producao.Lote = DW_Notas.Lote AND DW_Fato_Producao.Nota = DW_Notas.Nota AND DW_Fato_Producao.[Tipo Documento] = DW_Notas.[Tipo Documento] AND DW_Fato_Producao.[Numero Documento] = DW_Notas.[Numero Documento] GROUP BY DW_Notas.Competencia, DW_Fato_Producao.Lote, DW_Notas.[Data de Internacao], DW_Notas.Nota, DW_Notas.Id_Contrato HAVING (DW_Notas.Competencia = CONVERT(DATETIME, '2010-09-01 00:00:00', 102)) AND (DW_Notas.[Data de Internacao] <> CONVERT(DATETIME, '1900-01-01 00:00:00', 102)) AND (DW_Notas.Id_Contrato = 9400021187) Depois execute a função FOUND_ROWS(), assim:SELECT FOUND_ROWS() AS QT_INTERNACOES;
-
(Resolvido) Valores que se encontram em uma tabela e não na outra
pergunta respondeu ao MLeandroJr! de Denis Courcy em MySQL
Ok. Mas melhore forçando a leitura da esquerda para a direita assim: select STRAIGHT_JOIN dl.* from de_login dl left outer join de_mais_dados_candidato dmdc on dmdc.login_id = dl.login_id where dmdc.login_id is null -
SELECT p.nome_produto, f.nome_fornecedor, SUM(e.qtd_produto_estoque) AS quantidade FROM estoque e INNER JOIN produtos p ON e.id_produto_id = p.id_produtos INNER JOIN fornecedor f ON f.id_fornecedor = p.fornecedor_id_fornecedor WHERE e.qtd_produto_estoque > 0 GROUP BY p.nome_produto Não sei se o nome do campo "nome do fornecedor" é este: nome_fornecedor Se não for, troca.
-
Colocar a cláusula GROUP BY após a cláusula WHERE e antes da cláusula ORDER BY.
-
Não dá certo. O melhor é criar um campo que informe a ordem de ordenação.
-
Retornar resultado de um select, tudo em uma única linha
pergunta respondeu ao Ed Hector de Denis Courcy em MySQL
Sim. Mas o esforço é muito grande. Não vale a pena. É mais fácil através de linguagem de programação. -
Oi 'btpedro', select l.*, c.nome from licitacoes as l INNER JOIN licitacoes_clientes as c on l.cliente = c.cli where 1=1 $sqlCli $sqlFiltro $sqlData order by achouPalavra, cidade, uf, enviada"; 1): Evite usar asterisco. Informe os campos que você precisa. 2): Inverta a ordem desta igualdade l.cliente = c.cli 3): Crie indice para c.cli 4): Redefina esta pesquisa. where 1=1 $sqlCli $sqlFiltro $sqlData Não está comparando nada. Este é o ponto fraco. Aqui está gerando TABLE SCAN -------------------------------------- SEGUNDA QUERY select * from licitacoes_links where idLicitacao = '$res[id]' group by linkCompleto; 1)Evite usar asterisco. Informe os campos que você precisa. 2)Verifique se há indice para idLicitacao. Se não existir crie. Está gerando TABLE SCAN neste ponto. 3)Verifique se há indice para linkCompleto. Se não existir crie. Será mais fácil de agrupar se estiver ordenado por este campo ----------------------------------------- TERCEIRA QUERY select p.* from licitacoes_proc_intrasys as p INNER JOIN licitacoes_email as e on p.id = e.idProcIntrasys where e.idLicitacao = '$res[id]' group by data"); 1)Evite usar asterisco. Informe os campos que você precisa. 2)Inverta a ordem desta igualdade p.id = e.idProcIntrasys 3)Verifique se há indice para e.idProcIntrasys. Se não existir crie. A ausencia de índice aqui gera TABLE SCAN. 4)Verifique se há indice para e.idLicitacao. Se não existir crie. Está gerando TABLE SCAN neste ponto. 5)Verifique se há indice para data. Se não existir crie. Será mais fácil de agrupar se estiver ordenado por este campo
-
Tabela que retira -1 do seu valor automaticamente.
pergunta respondeu ao HUGO BORGES de Denis Courcy em MySQL
Oi, 'HUGO BORGES' Possivel é. Desde que você tenha a versão 5.1 do MySQL. Leia sobre Schedulle. -
Oi, 'Nívea Fernanda' Mostre a estrutura. Não dá ára adivinhar o que é.
-
Oi, 'Andre Lobo' Use storage procedure e schedulle. Mude a versão de seu Mysql para 5.1 ou maior, porque é a partir desta versão que aparece o serviço de schedulle.
-
Oi, 'sidney Jr. Miranda' Onde estão os binário de seu MySQL? Normalmente estão aqui: C:\Arquivos de programas\MySQL\MySQL Server 5.0\bin Verifique e execute de lá.
-
Oi, 'sidney Jr. Miranda' Se você está usando Linux/Unix como seu sistema operacional, o caminho acima é o indicado. Se você está usando windows, então siga este caminho (Resolvido) Descobrir senha de banco mysql
-
Descreva a logica de como você faria se fosse um programa. Leia no manual do mysql os capítulos 11. Functions and Operators, 12.1.9. CREATE PROCEDURE and CREATE FUNCTION Syntax, 12.7.6. Flow Control Constructs e 12.7. MySQL Compound-Statement Syntax. Estude, descreva, exiba aqui o que você conseguiu, depois, exponha suas dúvidas. Então te ajudarei.
-
Oi, Bernard Dividi sua solução em etapas para que fique bem didático: Etapa 1. Criação e carga da tabela de teste insert into bernard(faixa_etaria, Plano, Valor) values ('00 - 18','Pl01',100.00), ('00 - 18','Pl02',200.00), ('00 - 18','Pl03',300.00), ('19 - 23','Pl01',200.00), ('19 - 23','Pl02',300.00), ('19 - 23','Pl03',400.00); Etapa 2. SoluçãoSELECT faixa_etaria, SUM(IF(Plano='Pl01',Valor,0)) AS Pl01, SUM(IF(Plano='Pl02',Valor,0)) AS Pl02, SUM(IF(Plano='Pl03',Valor,0)) AS Pl03 FROM bernard GROUP BY faixa_etaria; Esta solução é chamada de pivot table. Ela apresenta problemas se a quantidade de planos for grande. Neste caso, uma solução melhor seria com o uso de uma storage procedure. Eu já publiquei uma aqui no forum e não faz muito tempo.
-
Oi, Guips! A solução será bem específica. Não permitirá grandes variações. Dividi a solução em etapas no meu banco de teste e exbibirei aqui por questão didática. Somente a última etapa será sua seleção. Etapa 1. Criação da tabela de teste e carga: create table guips( loja varchar(10), questao_A_sim int, questao_A_nao int, questao_B_sim int, questao_B_nao int, questao_C_sim int, questao_C_nao int)engine myisam; insert into guips(loja, questao_A_sim, questao_A_nao, questao_B_sim, questao_B_nao, questao_C_sim, questao_C_nao) values('LojaA',10,5,15,4,5,5),('LojaB', 5,6,10,5,15,6),('LojaC', 15,7,5,6,10,5), ('LojaX', 10,4,15,5,5,6),('LojaY', 5,5,10,6,15,5),('LojaZ', 15,6,5,7,10,4); Epata 2. Seleção de SIMsselect 'SIM' as DECISAO, SUM(questao_A_sim) AS QUESTAO_A, SUM(questao_B_sim) AS QUESTAO_B, SUM(questao_C_sim) AS QUESTAO_C FROM guips; Epata 3. Seleção de NAOsselect 'não' as DECISAO, SUM(questao_A_nao) AS QUESTAO_A, SUM(questao_B_nao) AS QUESTAO_B, SUM(questao_C_nao) AS QUESTAO_C FROM guips; Última etapa. Seu resultado:select 'SIM' as DECISAO, SUM(questao_A_sim) AS QUESTAO_A, SUM(questao_B_sim) AS QUESTAO_B, SUM(questao_C_sim) AS QUESTAO_C FROM guips UNION select 'não' as DECISAO, SUM(questao_A_nao) AS QUESTAO_A, SUM(questao_B_nao) AS QUESTAO_B, SUM(questao_C_nao) AS QUESTAO_C FROM guips;
-
Oi, 'Ed Hector' Desculpe o erro. Fiz a rotina apressadamente, sem testar e não percebi o erro. Tente assim: SELECT A.ID_ACESSO, visitante.ID_PESSOA AS ID_PESSOA, visitante.nome AS NOME_VISITANTE, cadastrante.nome AS CADASTRENTE, visitado.nome AS VISITADO, autorizante.nome AS AUTORIZANTE FROM ACESSOS A INNER JOIN PESSOAS visitante ON visitante.id_pessoa = A.id_pessoa LEFT JOIN PESSOAS cadastrante ON cadastrante.id_pessoa = A.cadastrante LEFT JOIN PESSOAS visitado ON visitado.id_pessoa = A.visitado LEFT JOIN PESSOAS autorizante ON autorizante.id_pessoa = A.autorizante
-
Oi, 'Ed Hector' Tente assim: SELECT A.ID_ACESSO, visitante.ID_PESSOA AS ID_PESSOA, visitante.nome AS NOME_VISITANTE, cadastrante.nome AS CADASTRENTE, visitado.nome AS VISITADO, autorizante.nome AS AUTORIZANTE FROM ACESSOS A INNER JOIN PESSOAS visitante ON visitante.id_pessoa = A.id_pessoa LEFT JOIN PESSOAS cadastrante ON cadastrante.id_pessoa = A.id_pessoa LEFT JOIN PESSOAS visitado ON visitado.id_pessoa = A.id_pessoa LEFT JOIN PESSOAS autorizante ON autorizante.id_pessoa = A.id_pessoa