Ir para conteúdo
Fórum Script Brasil

Denis Courcy

Moderadores
  • Total de itens

    3.089
  • Registro em

  • Última visita

Posts postados por Denis Courcy

  1. 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

  2. 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

  3. 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

  4. 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;

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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.)

  12. 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...