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. Sua sintaxe de sql foi escrita com erro. a cláusula WHERE aparece uma única vez na sintaxe e não duas conforme você escreveu. O correto seria assim. SELECT * FROM relatorios WHERE nomes LIKE '%".$busca."%' AND date LIKE '%".$date1."%'"; att Denis Courcy
  2. a primeira coisa que você deve fazer é verificar se há os seguintes arquivos na pasta onde está o banco "eventos" (onde está depende da configuração que você fez ao instalat o MySQL). EVE_EVENTOS.FRM /* layout da tabela */ EVE_EVENTOS.MYD /* conteudo dos dados */ EVE_EVENTOS.MYI /* conteudo dos indices */ Se uma delas estiver faltando, busque um backup mais atualizado. Se não encontrar um backup atualizado, então senta e chora. Se estiverem todas lá, então aplique myisamchk -f *.* conforme expliquei no tópico Erro Mysql Table 'tablename' IS MARKED AS CRACKED AND SHOULD BE REPAIRED. Faça e informe seucesso ou fracasso. att Denis Courcy
  3. A sintaxe corretas é aquela que te enviei antes. Porém o problema não é aquele. Observe o resultado que você enviou. Nele o atributo fk_categoria retorna um valor diferente na primeira e segunda linha. Respectivamente 165 e 166 para a 1a. e 2a. linha. com isso os registro são diferente. Veja o original em ingles "removal of duplicate rows from the result set" (Tradução: remove todas as linhas duplicadas do resultado). No seu caso, porque o atributo fk_categoria difere na primeira e segunda linha, as linhas (registros) não são coincidentes e serão retornadas tal como no exemplo enviado. Use distinct row somente com atributos que não se repetem (atributos essenciais para o retorno da informação) ou use a cláusula GROUP BY para agrupar (contando ou somando) os atributos. att Denis Courcy
  4. Segundo o Manual do MySQL (refman-4.1-pt.a4.pdf) Capítulo 6 item 6.4, ou a versão capítulo 13 item 13.2.7. "As opções DISTINCT, DISTINCTROW e ALL especificam quando registros duplicados devem ser retornados. O padrão é (ALL), todos os registros coincidentes são retornados. DISTINCT e DISTINCTROW são sinônimos e espcificam que registros duplicados no conjunto de resultados devem ser remopvidos." "The ALL, DISTINCT, and DISTINCTROW options specify whether duplicate rows should be returned. If none of these options are given, the default is ALL (all matching rows are returned). DISTINCT and DISTINCTROW are synonyms and specify removal of duplicate rows from the result set." Sendo assim, como resultado de sua query, qualquer atributo(campo) diferente em seu registro em comparação com o mesmo atributo em registro anterior, aparecerá como uma nova linha de resultado. Att Denis Courcy
  5. Sugiro que você leia as seguintes seções do manual do MySQL 4.1 em português: 4.10, 4.10.4, 4.6.4, 4.10.6 e demais seções associadas. Se continuar com dúvidas post novamente e analisaremos. Att Denis Courcy
  6. A sintaxe correta é SELECT DISTINCT departamentos.fk_sessao, produtos.id_produto, departamentos.fk_categoria, departamentos.fk_subcategoria, produtos.produto FROM produtos Inner Join departamentos ON departamentos.fk_produto = produtos.id_produto WHERE departamentos.fk_sessao = 34; Tente e informe se houve sucesso. att Denis Courcy Obs.: Para agilizar sua digitação sem prejudicar o entendimento do código, utilize alias para a tabela. Por exemplo: SELECT DISTINCT d.fk_sessao, p.id_produto, d.fk_categoria, d.fk_subcategoria, p.produto FROM produtos p Inner Join departamentos d ON d.fk_produto = p.id_produto WHERE d.fk_sessao = 34;
  7. Alexandre, O que aconteceu aqui é que você estava tentando usar uma variável como macrosubstituição de código. O interpretador do sql não consegue identificar a string dentro da variável como um código (SQL) a ser executado. Para ganhar performance, avalie quais os atributos mais utilizados em cláusulas where e crie indices para eles. att Denis Courcy Caro alexandre Inconformado com a resposta que te dei anteriormente, busquei no manual do MySQL e encontrei um meio de executar uma macrosubstituição Na seção 13.2.7 do manual do Mysql 5.0 (página 761) For prepared statements, you can use placeholders (supported as of MySQL version 5.0.7). The following statements will return one row from the tbl table: SET @a=1; PREPARE TESTE FROM 'SELECT * FROM tbl LIMIT ?'; EXECUTE TESTE USING @a; podemos fazer assim, também: SET @MeuSQL = 'SELECT * FROM tbl LIMIT ?'; SET @a=1; PREPARE TESTE FROM @MeuSQL; EXECUTE TESTE USING @a; TESTE = é um pseudodomando (um statement) que será utilizado em substituição a string que tem o comsndo propriamente dito. @a = neste caso estará substituindo o valor de "?". Assim, Seu Select ficaria assim: SELECT * FROM tbl LIMIT 1'; Ao realizar PREPARE TESTE FROM MeuSQL você estará dizendo ao interpretador que o comando em string dentro de @MeuSQL é um comando e será executado a seguir. A Linha EXECUTE TESTE USING @a, executa o comando que você programou. "Prepared execution is an efficient way to execute a statement more than once. The statement is first parsed to prepare it for execution. Then it is executed one or more times at a later time, using the statement handle returned by the initialization function. Prepared execution is faster than direct execution for statements executed more than once, primarily because the query is parsed only once. In the case of direct execution, the query is parsed every time it is executed. Prepared execution also can provide a reduction of network traffic because for each execution of the prepared statement, it is necessary only to send the data for the parameters. Prepared statements might not provide a performance increase in some situations. For best results, test your application both with prepared and non-prepared statements and choose whichever yields best performance. Another advantage of prepared statements is that it uses a binary protocol that makes data transfer between client and server more efficient." Ainda, segundo o manual, os statments a seguir podem ser utilizados como "prepared statements": CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, e a maioria dos and statements SHOW. Outors statements não são supportados no MySQL 5.0. Testa e avise se deu certo. att Denis Courcy
  8. Caro Alexandre, Pelo que conheço do MySQL não há como usar variável na cláusula where a não ser que esta contenha um valor específico. Exemplo Set @variavel =1; select * from cliente where clienteid = @variavel; que teria como resultado todos os clientes com clienteid = 1. No seu caso, você está querendo passar uma subquery dinâmica tanto como atributo do select e comparativo da cláusula where. O mecanismo neste caso é com o uso de uma função. Porém, pelo que entendi o select dentro da função teria que ser dinâmico, ou seja mudaria de tempos em tempos. Este pensamento está correto? Se sim, o melhor método seria uma execução em separado que geraria um script (arquivo texto com extensão .sql) a cada vez que você fosse alterar o tipo de pesquisa a ser efetuado, ou mesmo a geração deste script na forma de string dentro de sua aplicação. Vamos continuar avaliando. att Denis Courcy
  9. comande flush-logs. Será criado um novo arquivo de log e você poderá fazer seu backup, incluindo o backup do arquivo de log que estava em uso antes do flush-logs.
  10. Oi, Alexandre! Estive analisando sua solicitação e, até agora, não consegui visualisar com clareza o que você quer. Porém, especulando um pouco sobre o que você demonstrou, se sua função "MinhaFuncao" só retorna 0 ou 1, então basta chamá-la apenas uma vez, tal como abaixo, : Select 1 as diferente_de_zero, clientes.* from clientes where minhafuncao(clientes.codigo) <> 0 Sua sunção não vai retornar valor = 0, por isso não há a necessidade de chamar a função como atributo do select. Esclareça um pouco mais, e veremos o que pode ser feito. att Denis Courcy
  11. Neste caso a resposta é SIM. pois quando se cria este tipo de CONSTRAINT automaticamente o índice é criado. Porém, não é obrigatória a criação de constraint para todos os tipos de relacionamentos. A falta de índices pode degradar tremendamente a performance do sistema como um todo conforme as tabelas forem crescendo. Por boa prática sempre uso índice tanto para a chave estrangeira quanto para os atributos (campos) utilizados em cláusulas where. Uma exemplificação disso seria saber qual categoria está em que pedido. Então teríamos, sabendo que temos 100 categorias cadastradas na tabela de categorias e 10000 pedidos cadastrados na tabela de pedidos: Select * from idcategoria c inner join Pedidos p on c.idCategoria = p.idcategoria where c.idCategoria = 5; Sua pesquisa demandaria 10000 buscas em seu pior caso, se não houver índice, pois geraria o que chamamos de TABLE SCAN (uma pesquisa em toda a tabela de pedidos para que o idCategoria = 5 fosse encontrado nesta tabela. Pense no funcionamento de um índice conforme explico abaixo: Suponha que em uma tabela haja 100 registros e que o ID dela varia de 1 a 100. Sem indice o meu pior caso seria achar o registro com id = 50 pois tanto faria varrer a tabela de baixo para cima quanto de cima para baixo, a quantidade de registros lidos seria praticamente a mesma. Porém, se tenho índice e quero achar o o registro com id = 45, por exemplo, o sistema efetuaria, em tese, 7 leituras para achar a resposta. (obs. utilizei o método de pesquisa binária´para encontrar este número mágico). Pense bem quando cogitar não usar índices. att Denis Courcy Denis Courcy
  12. Denis Courcy

    Erro Mysql

    Este tipo de falha ocorre geralmente quando há falha no hardware. Seja rede (cabeamento, switch, placas de rede) ou memória (famosa tela azul do windows) ou, placa mãe travando por falha de refrigeração ou outra), ou outra. Verifique se há alguma estação com algum tipo de problema. 1 - Se os tipos de tabela que você está utilizando são não transacionais do tipo MyISAM ( o mais comum entre os iniciantes com MySQL) a correção é com o programa myisamchk.exe Este programa, está na pasta bin abaixo da pasta onde você instalou o MySQL no servidor. Siga estes passos: 1.1 - Avise a todos para sair da aplicação que acessa o banco. 1.2 - Uma vez que todos encerraram a aplicação, clique com o botão direito, no indicador de rede, na barra de ferramentas, próximo ao relógio 1.3 - escolha desativar a rede (você isolará o servidor da rede). Motivo esta tarefa é melhor realizada quando você está stand alone, ou seja, como um usuário isolado. Pois no há interferências no banco. 1.4 - entre em iniciar/ executar e digite cmd. 1.5 - vá para a pasta onde BIN onde o mydwl foi instalado; 1.6 - digite myisamchk -f *.* 1.7 - vá em meus locais de rede no desktop e clique com o botão direito do mouse, clique em propriedades e em rede local clique duas vezes para reativar a rede. 1.8 - Avise a todos que podem voltar ao trabalho. Pronto. 2 - Se você está utilizando tabelas transacionais tipo INNODB a correção pode ser feita de duas formas: A primeira usando o MySQLAdmin A segunda é desligando o servidor e religando. 2.1 Primeira solução para INNODB: 2.1.1 - caso você não tenha o mysql-administrator-1.1.2-win.msi vá a http://dev.mysql.com/downloads/gui-tools/5.0.html, baixe e instale. 2.1.2 - após instalar siga os passos 1.1, 1.2 e 1.3 da opção para MyISAM 2.1.3 - de um duplo clique no MySQL Admin e, na tela principal, na aba lateral, clique em Service Control 2.1.4 - clique no botão parar serviço (stop service) e aguarde a mensagem de que o serviço está parado (service stopped) 2.1.5 clique no botão iniciar serviço (start service) e aguarde a mensagem que o serviço está iniciado (service started) 2.1.6 repita os passos 1.7 e 1.8 2.2 Segunda solução para INNODB. (solução tupiniquim) 2.2.1 - siga o passo 1.1 2.2.2 - desligue e relique o computador (sertvidor de banco) 2.2.3 - siga o passo 1.8 att Denis Courcy
  13. Apesar de muita gente se enrolar, trabalhar com percentual é fácil depois que se aprende. Vamos fazer por exemplos para facilitar o entendimento. Se você deseja saber quanto é 20% de R$234,00 a conta é uma dessas: R$234,00 * 20 / 100 = 46,80 ou R$234,00 * 0,20 = 46,80 (Pois neste segundo caso, 0,20 é a mesma coisa que 20 /100) Se você deseja saber quanto seu funcionário ganhará depois que receber 5% de aumento a conta é uma dessas: Salário: R$ 380,00 + (380 * 5 /100) = 399,00 ou R$ 380,00 + (380 * 0,05) = 399,00 ou, o modo mais fácil, R$ 380,00 * 1,05 = 399,00 Se desejar saber qual o valor de uma mercadoria após um desconto de 6%) a conta é uma dessas: Mercedoria: R$ 66,00 - (66 * 6 / 100) = 62,04 ou R$ 66,00 - (66 * 0,06) = 62,04 att Denis Courcy
  14. A maneira correta de fazer isso é trazer os dois lados da pesquisa (o atributo e o valor que esta procurando) para um mesmo padrão. Neste exemplo vou trazer tudo para maiusculas. SELECT * FROM TABELA WHERE UCASE(coluna) LIKE = '%ALGO%' Ao atributo coluna foi aplicado a função UCASE (vide manual do MySQL) que transforma para maiúsculas um valor string passado em seu parâmetro. O objeto de pesquisa "ALGO" foi colocado em Maiúsculas para que a comparação não tenha problemas em encontrar o que se deseja. O resultado será (Algo,aLgo,aLGo,etc..) att Denis Courcy P.S. Esta é uma boa técnica para ser utilizada em qualquer tipo de pesquisa que seja NÃO SENSITIVE. (em liguagens de programação e em SQL, também.)
  15. A solução para este problema é criar um usuário root@% att Denis Courcy
  16. Denis Courcy

    Sql Query

    A solução para seu problema pode ser simplificada utilizando um join entre as tabelas onde teremos: select t1.nome, t1.cidade, t2.rua from tabela_1 t1 inner join tabela_2 t2 on t1.cidade = t2.cidade order by t1.nome, t1.cidade, t2.rua; A resposta seria: Nome cidade Ruas AAAA xyz RUA1 AAAA xyz RUA2 AAAA xyz RUA3 AAAA xyz2 RUA2 AAAA xyz2 RUA5 O acerto você faria via programa. att Denis Courcy PS. Para quem está começando em SQL, este tipo de join só retorna resposta se as duas tabelas satisfizerem as condições. Ou seja, se em uma delas (por exemplo a tabela_2) tiver uma cidade que não esteja contida na outra (neste caso tabela_1), esta cidade não aparecerá como resultado desta query.
×
×
  • Criar Novo...